strcat Problem



  • warum geht nicht?

    int test(char *s_buffer1, char *s_buffer2){
    
    strcat(s_buffer1,"\n");
    strcat(s_buffer2,"\n");
    
    printf("%s",s_buffer1);
    printf("%s",s_buffer2);
    
    getchar();
    return 0;
    }
    
    int main(){
    
    int test("hallo","ne");
    
    return 0;
    }
    

    aber das hier funktioniert:

    int test(char *s_buffer1, char *s_buffer2){
    
    strcat(s_buffer1,"\n");
    strcat(s_buffer2,"\n");
    
    printf("%s",s_buffer1);
    printf("%s",s_buffer2);
    
    getchar();
    return 0;
    }
    
    int main(){
    
    char test1[20];
    char test2[20];
    
    sprintf(test1,"hallo");
    sprintf(test2,"ne");
    
    int test(&test1[0], &test2[0]);
    
    return 0;
    }
    

    ich übergebe doch in beiden Fällen ein char array?
    es muss aber an dem strcat liegen, denn im Fall von

    int test(char *s_buffer1, char *s_buffer2){
    
    //strcat(s_buffer1,"\n");
    //strcat(s_buffer2,"\n");
    
    printf("%s",s_buffer1);
    printf("%s",s_buffer2);
    
    getchar();
    return 0;
    }
    
    int main(){
    
    int test("hallo","ne");
    
    return 0;
    }
    

    gibt es kein Problem...
    thx schon mal für eure Hilfe
    mit freundlichen Grüßen



  • sry... das int vor test("hallo","ne"); kommt natürlich weg 🙂



  • Du kannst nur in Speicher rumschreiben, der dir gehört - Stringliterale zählen nicht dazu. Du könntest beispielsweise auch nicht einfach schreiben

    char *p;
    *p = 'a'; // KAWUMM!
    

    Derartige Dinge erzeugen undefiniertes Verhalten, beispielsweise Segfaults.

    Mit

    char test[20];
    

    fordert du 20 chars an Speicher an, mit denen du machen kannst, wozu du lustig bist. Du musst aber vorsichtig sein, dass du nicht über diese Grenze hinausschreibst. Beispielsweise ist

    char test[] = "hallo";
    
    strcat(test, "\n"); // KAWUMM!
    

    ein Fehler, weil du nur so viel Speicher angefordert hast, dass "hallo" gerade hineinpasst. Aus diesem Grund solltest du, wenn du eine Fuktion in einen Buffer schreiben lässt, auch dessen Länge mit übergeben und beachten, etwa

    #include <stddef.h>
    #include <stdio.h>
    #include <string.h>
    
    void append_world(char *buf, size_t n) {
      /* Hänge ", world." an den String an, aber höchstens
       * so viele Zeichen, wie noch im Buffer Platz haben.
       */
      strncat(buf, ", world.", n - strlen(buf) - 1);
    }
    
    int main(void) {
      char hello[100] = "Hello"; // Dick Platz
      char hello2[10] = "Hello"; // zu kurz
    
      append_world(hello, 100);
      append_world(hello2, 10);
    
      puts(hello);
      puts(hello2);
    
      return 0;
    }
    
    /* Ausgabe:
     *
     * Hello, world.
     * Hello, wo
     */
    


  • hey top Sache und das noch um diese Uhrzeit 😃

    da ich in der main umbedingt eine Form von test("blah1","blah2"); haben möchte.
    muss ich also wohl extra ein array definieren?

    int test(char *s_buffer1, char *s_buffer2){
    
    char s_test1[20];
    char s_test2[20];
    
    sprintf(s_test1,"%s\n",s_buffer1);
    sprintf(s_test2,"%s\n",s_buffer2);
    
    printf("%s",s_buffer1);
    printf("%s",s_buffer2);
    
    getchar();
    return 0;
    }
    
    int main(){
    
    int test("blah1","blah2");
    
    return 0;
    }
    

    thx nochmal für deine schnelle Hilfe 🙂
    dachte nur, dass ich mir die extra arrays sparen kann...^^



  • Naja, speziell für diesen Fall könntest du auch einfach

    printf("%s\n", s_buffer1);
    

    bzw.

    puts(s_buffer1),
    

    schreiben. Wenn du aber in einem String rumschreiben willst, brauchst du dafür einen Buffer.



  • ja^^
    Das war nur ein Beispiel, in meinem quellcode muss
    ich aus einer .txt die Strings zwischen zwei
    Stichwörtern ausgeben, also z.B.

    testanfang
    blaaaaaaaaaaah blaaaaaaah
    blaaaaaaaaaaah blaaaaaaah
    blaaaaaaaaaaah blaaaaaaah
    blaaaaaaaaaaah blaaaaaaah
    testende

    und dazu muss bei strcmp(buffer,array) im array ein '\n' am Ende stehen^^



  • Übergib halt "testanfang\n" bzw. "testende\n".



  • das ist aber so unschön 😃



  • woot? schrieb:

    das ist aber so unschön 😃

    Wie suchst du dann nach dem Text zwischen Stichwörtern, die nicht mit einem Umbruch enden?
    🙂



  • Zu dem Programm gibt es eine text.dll in der sämtliche
    Texte enthalten sind 🙂

    z.B. loadtext("Menüanfang","Menüende");

    Menüanfang
    ------------------------
    (1) Laden
    (2) Speichern
    (3) Bearbeiten
    (4) Beenden
    ------------------------
    Menüende

    loadtext ("Menüenglish","Menüenglishend");

    Menüenglish
    ------------------------
    (1) Load
    (2) Save
    (3) Change
    (4) Quit
    ------------------------
    Menüenglishend

    loadtext ("error04start","error04end");

    error04start
    Die zu ladende Datei konnte nicht gefunden werden.
    Möchten sie eine Datei mit genannten Namen erstellen (JA)/(Nein):
    error04end

    so vom Prinzip^^
    noch mal Danke für eure Hilfe


Anmelden zum Antworten