Quellcode wiedergeben



  • Ich hab da mal eine Frage:

    Wenn man eine Kopie des eigenen Quellcodes auf dem Bildschirm ausgeben will, ohne auf eine Datei zuzugreifen, kann man das mit irgendeiner Preprozessor-Direktive machen? Ist da irgendwo der Quellcode der aktuellen Zeile gespeichert?


  • Mod

    Nein, für dein Quine musst du schon trickreicher programmieren (außer du verwendest HQ9+ als Sprache 🤡 ). Die übliche Vorgehensweise ist, dass du eine clevere Funktion bastelst, die deinen Quelltext durch "Berechnung" (üblicherweise Stringmanipulationen) als Ergebnis hat und das Funktionsergebnis dann ausgibst.

    edit: Hier ein Beispiel aus Wikipedia:

    char*f="char*f=%c%s%c;main() {printf(f,34,f,34,10);}%c";main() {printf(f,34,f,34,10);}
    

    Dieser Code nutzt aus, dass die Funktion printf aus einfachen Argumenten eine komplexe Ausgabe machen kann. Man sollte dazu noch wissen, dass 34 in ASCII für Anführungsstriche steht, dieses Beispiel funktioniert folglich nicht auf extrem exotische Maschinen.



  • Also mein Buch beantwortet die Frage so:

    /* dieses Programm listet sich selbst */
    #include <string>
    #include <iostream>
    using namespace std;
    char AS = 34;         // Anführungsstriche
    char BS = 92;         // Backslash
    char NZ = 10;         // neue Zeile
    void c(const string& t) {
      cout << t << AS;
      unsigned int i = 0;
      while (i < t.length()) {
         if (t[i] == NZ) cout << BS << 'n'<<AS<< t[i] << AS;
         else cout << t[i];
         ++i;
      }
      cout<<AS<<')'<<';'<<'c'<<'('<<'s'<<')'<<';'<<'}'<<NZ;
    }
    int main(){ string s("/* dieses Programm listet sich selbst */\n"
    "#include <string>\n"
    "#include <iostream>\n"
    "using namespace std;\n"
    "char AS = 34;         // Anführungsstriche\n"
    "char BS = 92;         // Backslash\n"
    "char NZ = 10;         // neue Zeile\n"
    "void c(const string& t) {\n"
    "  cout << t << AS;\n"
    "  unsigned int i = 0;\n"
    "  while (i < t.length()) {\n"
    "     if (t[i] == NZ) cout << BS << 'n'<<AS<< t[i] << AS;\n"
    "     else cout << t[i];\n"
    "     ++i;\n"
    "  }\n"
    "  cout<<AS<<')'<<';'<<'c'<<'('<<'s'<<')'<<';'<<'}'<<NZ;\n"
    "}\n"
    "int main(){ string s(");c(s);}
    

    Wenn ich das jetzt richtig sehe schreibt er das programm einfach nur in einen String oder was? Ich seh da auf den ersten Blick nicht wirklich was kompliziertes drin..



  • Du vergisst, dass der String, der das Programm enthalten soll, Teil des Programms ist.


Anmelden zum Antworten