char mit char belegen --> problem mit sprintf



  • Hi Leute, kann mir jemand sagen, wie ich folgendes richtig mache???

    char text2[]     =  "Text";  
        char text[]    = text2[];
    

    thx, mfg



  • char text2[] = "Text";
    char *text = text2;
    

    ... wenn ich das jetzt richtig verstanden habe.



  • ja hast du, thx.
    und wie kann ich daten aus nem ineteger auf nem char speicher???

    also so in der art char *text = integer_x



  • Willst du, dass die Zahl als Zeichenfolge in den char-Array gespeichert wird oder willst du wirklich nur den Wert auf ein Element des Arrays speichern?



  • da ich den o. g. 1. Fall vermute, hoffe ich, dass dir die funktion ecvt(...) aus der Haederdatei stdlib hilft.
    bye, Theo



  • Also eigentlich brauche ich sowas in der Art:

    char *text = variable, text, variable, text

    Habt ihr da vielleicht ne Idee?



  • ich verstehe deine Frage leider nicht, ...

    ... aber ich kann mir vorstellen, dass du Funktionen wie
    strcpy oder strcat usw.
    suchst!?

    Viel Erfolg wünscht Theo



  • Also ich möchte ein char-array (das ich später als message per net send versende, was schon geht 😃 ) mit mehreren Werten belegen. Mit Text, einer Variablen, wieder Text und noch einer Variablen!
    Leider bin ich noch Anfänger und hab keine Ahnung wie das geht!!!

    so in der art sieht das aus:
    int quelle1_1 = 151;
    int quelle_2 = 20;

    char x[] = text, i, text, y;

    Was ich jetzt schon hingekriegt habe ist das hier:

    int     quelle_1 = 151;
       int     decimal;   
       int     sign;
       int     precision = 3;
    
       char *text = _ecvt( quell_1, precision, &decimal, &sign );
    

    Wenn ich text ausgebe krieg ich 151, das ist ja auch richtig, ich würde aber gerne auf die nachfolgenden Teile des Arrays noch anderen Text usw. speichern!!! Wie geht das??? 😕



  • Du weißt wie man printf() verwendet, oder??

    Dann schau dir mal sprintf() an. Da wird nämlich das ganze nicht am Bildschirm ausgegeben, sondern in einen String (char-Array) ;).



  • so langsam dämmert's auch mir wo der Zug hingeht!
    Folgendes Beispiel veranschaulicht AJs Vorschlag

    #include <conio.h>
    #include <stdio.h>
    #include <iostream.h>
    
    int main()
    {
      int i = 123;
      float f = 1.234;
      char *text1 = " Integer: ";
      char *text2 = " Float: ";
    // die 4 Items mit printf auf den Screen ... mit Zeilenumbruch (\n) dazwischen
      printf("%s%i\n%s%f", text1, i, text2, f);
    
      char *string_to_send = "";       // ... und dann das gleiche in einen String
      sprintf(string_to_send,"%s%i\n%s%f", text1, i, text2, f);
      cout << endl << string_to_send; // Ausgabe zur Kontrolle mit cout
      getch();
      return 0;
    }
    

    Viel Erfolg, Theo



  • Hab das Beispiel jetzt mal eingebaut und ausprobiert, es funktioniert auch, also es wird:
    Integer: 123...
    Float: 1.234...
    Integer: 123...
    Float: 1.234...
    ausgegeben.
    Allerdings steht gleich anschließend "Der Befehl "Float:" ist entweder falsch geschrieben oder konnte nicht gefunden werden und der folgende Code wird nicht mehr ausgeführt, obwohl er völlig unabhängig von dem anderen ist.

    Also das ist der Code, den ich jetzt aus dem Beispiel eingefügt habe, nur ganz gering verändert, nur erstmal zum testen.

    float f2 = 1.234; 
      char *text1 = " Integer: "; 
      char *text3 = " Float: "; 
    // die 4 Items mit printf auf den Screen ... mit Zeilenumbruch (\n) dazwischen 
      printf("%s%i\n%s%f2", text1, i, text3, f2); 
    
      char *string_to_send = "";       // ... und dann das gleiche in einen String 
      sprintf(string_to_send,"%s%i\n%s%f2", text1, i, text3, f2); 
      cout << endl << string_to_send; // Ausgabe zur Kontrolle mit cout 
      getch();
    

    Wenn ich nur den Code beispielcode ohne meinen eigenen danach ausführe, bekomme ich übrigens nach oben ausgeführter Ausgabe noch mal:
    Float: 1.234...
    und zwar erst nach dem Tastendruck (getch)!
    Und wenn ich anstelle von:
    char *string_to_send = "";
    char *string_to_send = new char;
    schreibe kommt das wiederholte float übrigens nicht, dann stürzt er allerdings anschließend mit Fehler ab.
    Ich vermute mal, dass das auch was damit zu tun hat, aber was???
    please help!



  • Das Beispiel von Theosoft ist ein klassischer Bufferoverflow. Da kein Speicherplatz reserviert ist für den String, den du in string_to_send schreibst, wird das ganze Zeug irgendwo danach hingeschrieben und es kann zu solchen lustigen Sachen, wie bei dir, kommen. Es kann allerdings auch mit einer Fehlermeldung enden (Zugriffsverletzung).

    Abhilfe schafft also ganz einfach genügend Speicherplatz zu reservieren. Schreib mal anstatt

    ...
    char *string_to_send = "";
    ...
    

    besser

    ...
    char string_to_send[100];
    ...
    

    Bei deinem eigenen Code sollte es funktionieren, wenn du die Zahlen einfach noch in deinen sprintf() einbaust und das ganze auf den Speicher von befehl schreibst (wie du es ja momentan auch machst).



  • Danke, mit deinem Beispiel funktionierts, aber kannst du mir das nochmal (nur verständnisshalber) erklären?

    Also mit

    ...
    char *string_to_send = "";
    ...
    

    definiere ich doch einen Zeiger, den ich dann doch eigentlich noch mit new char initialisieren müsste, oder???
    Und da müsste dann doch eigentlich auch genug Speicher dasein, oder nicht???

    Und mit deinem Beispiel

    ...
    char string_to_send[100];
    ...
    

    erstelle ich ein Array mit 100 Elementen, das heißt die Größe ist begrenzt, aber es muss doch auch möglich sein, dass er das selber einstellt wieviel speicher er braucht, also wenn die Größe unbekannt wäre, z.b. bei ner eingabe???

    THX



  • Stimmt mit new oder auch malloc() könntest du dynamisch die Größe des Arrays ändern. Was aber bei dem Beispiel, dass du vorher gepostet hast, nicht der Fall ist ;). Das Reservieren wird auch nicht automatisch von den Funktionen, wie z. B. sprintf() oder fgets() gemacht. Das muss der Programmierer vorher selber machen und auch dafür sorgen, dass genug Speicher reserviert ist, sonst kann es zu dem seltsamen Verhalten kommen, dass du beschrieben hast, wegen dem Bufferoverflow.


Anmelden zum Antworten