Stringfrage (C-Neuling)



  • Hallo,

    ich habe vor lurzem angefangen C zu lernen. Nun bin ich auf etwas gestossen das ich mir nicht ganz erklären kann. Dazu muß ich sagen das ich auch noch nicht besonders weit fortgeschritten bin, würde es aber dennoch gerne gleich aus der Welt schaffen 🙂

    /*stringtest.c*/
    #include <stdio.h>
    
    int main(void) {
        char str[]="Text";
        printf("%s",str+1);
        return 0;
    }
    

    Ausgabe in der WinXP Commandline:

    ext

    -------------------------------------------------------------------------------

    Hat das irgendwas damit zu tun das sich bei dem Striung um ein char-Array handelt ? Was bewirkt die Addition eines Integerwertes zu diesem ? Mir ist einfach nicht ganz klar was diese Addition intern bewirkt.

    Wäre über jeden erhellenden Kommentar dankbar.



  • hi,
    'printf' braucht die adresse des strings, den du ausgeben willst. gibst du printf den arraynamen (str in deinem beispiel), dann gibst du den ganzen arrayinhalt aus (printf beginnt ab dieser adresse und gibt alle zeichen aus). wenn du aber 'str+1' an printf übergibst, dann ist das die adresse des nächsten arrayelements d.h. printf bekommt gar nicht mit, das davor noch was ist - und gibt das array aus, aber ohne das erste element.



  • OK, danke. Wusste noch nicht wie das mit den Arrays in C läuft, bin ja noch ganz am Anfang. Nun ist es aber klar.



  • Hi,

    stell dir das Array vor wie ganz viele Garagen die nebeneinander stehen.
    Die Funktion 'printf' faengt dann vorne bei der ersten an, den Inhalt auszugeben und laeuft bis sie in einem Arrayelement (Garage) die Nullterminierung findet (\0).

    Wenn du nun 'printf("%s",str+1);' machst, faengt er halt bei der 'ersten+1', sprich der zweiten an 🙂



  • Hi,

    ich habe mal eine Frage: Wie kommst Du eigentlich auf

    Brezel schrieb:

    ....

    ...str+1);
    

    ...

    ?

    Hast Du das irgendwo abgetippt oder wolltest Du damit etwas Bestimmtes erreichen ?
    Ich frage, weil wir Dir hier auch helfen wollen, das zu erreichen, was Du eigentlich vorhattest ....

    Gruß,

    Simon2.



  • Nein , ich hatte es abgetippt, da stand aber noch keine Erklärung des Verhaltens.

    Vom Grundsatz her kenne ich Arrays ja von Python, nur das man dort eben wenn man z.B. ein Liste hat, sagen wir mal

    liste=[1,2,3,4,5]

    die elemente 1-4 ausgibt indem man folgendes macht:

    liste[1:]

    Ich war nur kurz verwirrt weil es bei C so aussah als wurde es sich irgendwie um eine Rechenoperation handeln. Dem ist ja aber nicht so. Sache ist auf jeden Fall geklärt. Werde in meinem Tutorial auch bald bei den Arrays ankommen. Die Sache ist doch schon einfacher als würde man seine erste Sprache lernen, auch wenn natürlich einige Unterschiede zu Python existieren. Interessant ist C aber auf jeden Fall. Gerade die doch relativ hardwarenahe Programmierung macht das ganze sehr aufschlussreich.

    Euch allen nochmal meinen Dank für eure Mühe 🙂



  • Brezel schrieb:

    Ich war nur kurz verwirrt weil es bei C so aussah als wurde es sich irgendwie um eine Rechenoperation handeln. Dem ist ja aber nicht so.

    Doch, ist es - sogenannte Pointer-Arithmetik 😉
    (Arrays werden implizit in Zeiger umgewandelt, wenn du sie herumreichst. Und Addition verschiebt einen Zeiger vorwärts zur nächsten Adresse)



  • Brezel schrieb:

    Ich war nur kurz verwirrt weil es bei C so aussah als wurde es sich irgendwie um eine Rechenoperation handeln.

    du könntest es auch so machen:

    printf("%s", &str[1]);
    

    hierbei kommt der adressoperator '&' ins spiel. das verdeutlicht etwas, dass die adresse des arrays übergeben wird, nicht das array selber.

    CStoll schrieb:

    (Arrays werden implizit in Zeiger umgewandelt, wenn du sie herumreichst...

    das array wird nicht umgewandelt. es wird dessen anfangsadresse weitergereicht. auf das array selber hat das keinen einfluss....



  • Ok, gut zu wissen.

    Nun ja, werde ich ja alles in bälde noch ausgiebig behandeln, aber ist gut das schonmal im Hinterkopf zu haben. Das hatte mich gestern echt ein wenig verwirrt.


Anmelden zum Antworten