sprintf --- Illegal instruction



  • naja, an den includes kann es ja eigentlich nicht liegen, das statement

    sprintf(buffer,"test%s","1");
    

    klappt ja wunderbar.
    d.h. es liegt irgendwie an dem zugriff auf das array chr, was nach meinem verständniss ja genau den string "1" zurückliefern sollte...
    das printf ist auch nur zu testzwecken da, eigentlich soll buffer überhaupt nicht an stdout gegeben werden, sondern dann den pfad zu einer datei enthalten, die geöffnet werden soll. also an sich geht es hier nur darum, die einträge in chr[] mit dem pfad zu verschiedenen dateien zu konkatenieren.
    grüße



  • didhavn schrieb:

    naja, an den includes kann es ja eigentlich nicht liegen, das statement

    sprintf(buffer,"test%s","1");
    

    klappt ja wunderbar.
    d.h. es liegt irgendwie an dem zugriff auf das array chr, was nach meinem verständniss ja genau den string "1" zurückliefern sollte...
    das printf ist auch nur zu testzwecken da, eigentlich soll buffer überhaupt nicht an stdout gegeben werden, sondern dann den pfad zu einer datei enthalten, die geöffnet werden soll. also an sich geht es hier nur darum, die einträge in chr[] mit dem pfad zu verschiedenen dateien zu konkatenieren.
    grüße

    Das Array enthält std::strings. Versuch's mal mit:

    char *chr[2] = {"1","2"};
    

    Stefan.



  • mir scheint, du bringst da so einiges durcheinander.

    wie schon erwähnt, gibts in C++ cin und cout für die Ein und Ausgabe.
    Für Stringverknüpfungen kann man wunderbar auch die Stringklasse verwenden.

    //entweder
       string chr = "12";
    
        //oder
       const char *chr = "12";
    
       //oder (Nullterminierung nicht vergessen)
       char chr[3] = {'1','2','\0'};
    

    Möchtest du dennoch deinen String in sprintf verwenden, so musst du diesen in einen C-String wandeln also quasi mit chr.c_str().

    // einen String
    sprintf(buffer,"test%s", chr.c_str());
    
    // ein einzelnes Zeichen
    sprintf(buffer,"test%c", chr[0]);
    

    printf und sprintf müssten sich in der cstdio - Header befinden, wenn sie nicht automatisch durch irgendwas anderes schon zur Verfügung gestellt werden.



  • Warum programmierst du C in C++?



  • @ BasicMan01: danke für die anregung, ich werd mal schauen was ich damit anstellen kann.

    @ Janjan: tu ich das?? 😉



  • Ja tust du. Wie wärs mit C++ statt C? 😉



  • didhavn schrieb:

    @ Janjan: tu ich das?? 😉

    printf und sprintf sind C-Funktionen die in C++ wenig bis garnichts zu suchen haben. char-Arrays sind auch C-Relikte (heißen deshalb ja auch C-Strings), in den meisten Fällen ist es sinnvoller, String-Klassen wie std::string zu benutzen.



  • @All: danke für die hinweise, dann werd ich da wohl einiges ändern müssen 🙂



  • didhavn schrieb:

    @All: danke für die hinweise, dann werd ich da wohl einiges ändern müssen 🙂

    Wie gesagt, n ordentliches Buch ist das wichtigste, wenn du grade anfängst.



  • Hi didhavn,

    hier mal zum Vergleich:

    didhavn schrieb:

    ...

    #include <iostream>
    #include<fstream>
    using namespace std;
    
    int main()
    {
      string chr[2] = {"1","2"};
      char buffer[10];
      sprintf(buffer,"test%s",chr[0]);
      printf(buffer);
    
      return 0;
    }
    

    in C wäre richtig gewesen:

    #include <stdio.h>
    
    int main()
    {
      char chr[2] = {'1','2'};
      char buffer[10];
      sprintf(buffer,"test%c",chr[0]);
      printf(buffer);
    
      return 0;
    }
    

    in C++ hätte es geheißen:

    #include <iostream>
    #include <string>
    using namespace std; //dies ist nicht ganz optimal, aber hier lassen wir es mal so
    
    int main()
    {
      char chr[2] = {'1','2'};
      string buffer = "test";
      buffer += chr[0];
      cout << buffer;
      return 0;
    }
    

    Ich persönlich finde Zweiteres durchaus einfacher/lesbarer - und sicherer ist es zudem auch. 😃

    ... und wenn es denn folgendes Prinzip wird, wird's auch einfach:

    #include <iostream>
    #include <sstream>
    
    using namespace std;
    
    int main()
    {
       for(int i=1; i<10; ++i) {
         ostringstream buffer;
         buffer << "test" << i;
         cout << buffer.str() << '\n';
       }
       return 0;
    }
    
    // theoretisch würde natürlich auch
    //     for(int i=1; i<10; ++i) cout << "test" << i << '\n';
    // reichen, aber Du willst ja vermutlich irgendetwas mit dem string anfangen und ihn nicht nur ausgeben...
    

    Gruß,

    Simon2.



  • Simon2 schrieb:

    in C++ hätte es geheißen:

    👎
    C++ schließt automatisch auch die guten Lösungen von C mit ein.
    ~Außerdem würde ich sprintf eher mit stringstreams vergleichen und ein einfaches += wäre strcat.~
    Sowas wie "sprintf ist meistens nicht gut" ist ja ok, aber "sprintf ist kein C++" ist einfach falsch und führt bei Neulingen gerne zu dem verzerrten Bild, man müsse immer mit Gewalt C++-Sachen benutzen, die es in C nicht gibt, auch wenn schöne Sachen existieren, die C++ und C sind.
    Klassiker:

    const std::string filename="C:\\test.txt";
    

    Jedes mal, wenn jemand sowas schreibt, muß ein Engel sterben.



  • Soviel geballter Irrtum.. Traurig.



  • Janjan schrieb:

    Soviel geballter Irrtum.. Traurig.

    Ohne Begründungen und Erläuterungen ist der Beitrag alles andere als hilfreich. Klär uns auf.



  • volkard schrieb:

    ...C++ schließt automatisch auch die guten Lösungen von C mit ein. ...

    volkard - Du bist lange genug dabei, um zu wissen, dass hier mit

    • "...in C++"

    meint

    • "...mit den in C++ hinzugekommenen Möglichkeiten implementiert ...".

    (Eigentlich müsstest Du begeistert sein von asm , denn das ist dann ja auch "... in C++ ...". )

    Und ich bin lange genug dabei, um zu wissen, dass sowas diesen Reflex bei Dir auslöst. :p

    Übrigens habe ich gar nicht den Anspruch, mit meine Antworten in jedem beliebigen Zusammenhang und für jeden beliebigen Leser korrekte Aussagen zu treffen. Ich möchte lediglich dem Fragesteller bei der Lösung seines Problems helfen - wo meine Antwort diesem Ziel entgegensteht, bin ich gerne bereit, das zu revidieren...

    Gruß,

    Simon2.

    P.S.: Den Hinweis auf stringstreams findet der geneigter Leser durchaus in meinem Post und ich finde immer noch, dass man einem Anfänger ein wenig entgegenkommen und die Möglichkeiten von std::string zeigen kann (ohne sie als "immer best/einzige/... Lösung ever" anzupreisen).



  • Ich weiß, worauf du hinaus willst, volkard, aber ich muss trotzdem anmerken, dass es durchaus Situationen gibt, in denen

    std::string const foo = "bla";
    

    Sinn ergibt. Beispielsweise könnte es sein, dass ich die Breite eines Labels abschätzen will und regelmäßig die Länge des Strings benötige, und dann kann das einmalige Erstellen eines String-Objekts kostengünstiger sein, als jedes mal strlen laufen zu lassen.

    Es ist allerdings richtig, dass man, wenn man find, Substring-Vergleiche oder anderen Kram, den std::string mitbringt, nicht braucht, mit einem nackten char-Zeiger besser dran ist.

    Aber: Ich kriege jedes mal die Krätze, wenn ich etwas wie

    char *chr = "12";
    

    sehe. Niemand hat mehr Respekt vor cv-Qualifiern. 😞 Bitte, bitte,

    char /* --> */ const /* <-- */ *chr = "12";
    


  • seldon schrieb:

    Aber: Ich kriege jedes mal die Krätze, wenn ich etwas wie

    char *chr = "12";
    

    sehe. Niemand hat mehr Respekt vor cv-Qualifiern. 😞 Bitte, bitte,

    char /* --> */ const /* <-- */ *chr = "12";
    

    😃 Sorry ... hab es korrigiert ... nicht schimpfen 🤡



  • seldon schrieb:

    Ich weiß, worauf du hinaus willst, volkard, aber ich muss trotzdem anmerken, dass es durchaus Situationen gibt, in denen

    std::string const foo = "bla";
    

    Sinn ergibt. Beispielsweise könnte es sein, dass ich die Breite eines Labels abschätzen will und regelmäßig die Länge des Strings benötige, und dann kann das einmalige Erstellen eines String-Objekts kostengünstiger sein, als jedes mal strlen laufen zu lassen.

    Ja, klar. Deswegen das Beispiel mit Dateipfaden, die dann doch nur zum reinstopfen in fstream-Konstruktoren benutzt werden. Je nachdem, was man so machen mag, nimmt man irgendwelche geeigneten Sachen. string ist oft geeignet.
    Manchmal hole ich mir die Größe compilezeitkonstanter Strings mit sizeof.



  • volkard schrieb:

    Simon2 schrieb:

    in C++ hätte es geheißen:

    👎
    C++ schließt automatisch auch die guten Lösungen von C mit ein.

    Nicht nur die guten. Aber das will man ja mit Gewalt leugnen.



  • NERDRAGE!

    🙄


Anmelden zum Antworten