nicht null-terminierter String (->pointer!)



  • hi, ich mach's kurz:

    Jeder String kriegt ja von C automatisch eine Null-Terminierung.

    Ich habe in einem C Tutorial gelesen, dass z.B. beim String:

    char arr[] = "Hallo";
    

    das Zeichen '\0', also die Terminierung, bei arr[6] ist.

    Also sozusagen zwei Stellen nach dem letzten Buchstaben.

    Langer Rede, kurzer Sinn:

    Wie ist das bei Pointern? Also:

    char *p[];
    p = arr;
    

    Ich hab das getestet, kann aber z.B. jetzt mit

    p[6] = 'a'
    

    die Null-Terminierung nicht überschreiben, und irgendwie findet er überhaupt keine Null-Terminierung...

    Ich brauche das aber, weil eine Funktion nen String Pointer bekommt, und ich will sicherstellen, dass der String auch wirklich terminiert!

    merci 🙂



  • also es heist erstmal:

    char *p;
    p = arr;
    

    und dann sollte

    p[5] = 'a'; //p[0] = 'H'...p[4]= 'o' dein Denkfehler!
    

    auch die 6.Stelle von arr überschreiben. Also eine einfache Methode um sicherzustellen daß dein String nullterminiert ist wäre so zu realieren:

    strcpy(arr,arr);
    

    strcpy macht immer eine Nullterminierung



  • edit:
    hat sich erledigt!
    danke, ich hab schon dauernd die terminierung entfernt, das aber nicht gemerkt aus anderen gründen..

    mfg



  • guggst du? schrieb:

    Also eine einfache Methode um sicherzustellen daß dein String nullterminiert ist wäre so zu realieren:

    strcpy(arr,arr);
    

    das glaub' ich nicht. selbst 'strcpy' kann keine zaubertricks vollbringen.
    🙂



  • So lange der Array groß genug ist, terminiert strcpy den String.



  • strcpy() kann nur funktionieren wenn src nullterminiert ist. Desweiteren ist strcpy(foo, foo) eh undefiniert, egal ob nun Strings oder sonstwas übergeben wird.



  • Tim schrieb:

    Desweiteren ist strcpy(foo, foo) eh undefiniert

    warum das? eigentlich sollte strcpy(foo, foo) bei einem nullterminierten string keine wirkung haben (alle zeichen einschliesslich der 0 auf sich selbst kopieren) und bei einem nicht-nullterminierten char-array bei der ersten, zufällig im speicher stehenden, 0 stoppen.
    🙂



  • grökaz schrieb:

    Tim schrieb:

    Desweiteren ist strcpy(foo, foo) eh undefiniert

    warum das?

    Weil es so definiert wird:

    man strcpy schrieb:

    The strcpy() function copies the string pointed to by src, including the terminating null byte ('\0'), to the buffer pointed to by dest. The strings may not overlap, and the destination string dest must be large enough to receive the copy.



  • supertux schrieb:

    The strings may not overlap

    jo, aber die verfasser dieses textes dachten bestimmt an strcpy(foo, foo+x), was verständlicherweise datensalat geben kann. ich hab' z.b. letztens ein strcpy gesehen, dass so anfing:

    char *strcpy (char *a, char *b)
    {
      if (a == b)
        return a;  // oder b
      ...
    }
    

    🙂



  • *lol*

    @ net: Denke vielleicht auch mal an restrict. Im Standard ist der Prototyp ja:

    char *strcpy(char * restrict s1, const char * restrict s2);
    

    Da wäre strcpy( foo, foo ); schon ohne Code ein no-go.



  • nusspüree mit dill schrieb:

    guggst du? schrieb:

    Also eine einfache Methode um sicherzustellen daß dein String nullterminiert ist wäre so zu realieren:

    strcpy(arr,arr);
    

    das glaub' ich nicht. selbst 'strcpy' kann keine zaubertricks vollbringen.
    🙂

    yo hast schon recht ist mir auch aufgefalen nachdem ich den Quatsch geposte hab 🙂



  • Tim schrieb:

    @ net: Denke vielleicht auch mal an restrict.

    stimmt, das 'restrict' beisst dich mit 2 pointern, die auf gleiche oder überlappende bereiche zeigen.
    🙂


Anmelden zum Antworten