String in seine einzelteile zerlegen.



  • Hallo,

    In php gibt es eine schöne funktion namens substr.
    Sie gibt einem ein zeichen an belibger stelle wieder.
    Gibt es was vergleichbares auch in c oder wie muss ich das angehen???

    Danke schonmal



  • Informier dich mal über:
    strchr
    strtok
    strstr

    Evtl. sind auch die anderen Stringfunktionen interessant.

    http://www.cplusplus.com/reference/cstring/



  • Wenn es wirklich nur ein Zeichen ist, solltest du dich daran erinnern, dass ein String in C ein nullterminiertes Char-Array ist.
    Und wie man auf Array-Elemente zugreifst, solltest du wissen.



  • Ja habe ich auch gerade gesehen. Bin noch recht neu in c. Das heist ein variabel die als char deklariert ist, ist automatisch auch ein array???

    sprich:

    char test = "Hallo Welt";
    

    ist schon ein array???



  • sven1987h schrieb:

    Ja habe ich auch gerade gesehen. Bin noch recht neu in c. Das heist ein variabel die als char deklariert ist, ist automatisch auch ein array???

    sprich:

    char test = "Hallo Welt";
    

    ist schon ein array???

    Nein, das kompiliert nicht, da es nur ein einzelnes Zeichen ist.

    char test = 'H';
    

    wäre richtig.

    Was du meinst ist:

    char *test = "Hallo Welt";
    

    bzw.

    char test[] = "Hallo Welt";
    

    Ersteres verhält sich wie ein Array, zweitest IST ein Array.


  • Mod

    sven1987h schrieb:

    Ja habe ich auch gerade gesehen. Bin noch recht neu in c. Das heist ein variabel die als char deklariert ist, ist automatisch auch ein array???

    sprich:

    char test = "Hallo Welt";
    

    ist schon ein array???

    Nein, das ist einfach nur falsch und compiliert nicht. char-Arrays sind nicht anders als andere Arrays, außer dass man sie auch mit Zeichenkettenliteralen initialisieren darf:

    int i; // Ein int
    int i[3]; // Array aus 3 ints
    int i[3] = {1,2,3}; // Array aus 3 ints mit Initialisierung
    int i[] = {1,2,3,4}; // Array aus ints mit Initialisierung, Länge (4) wird automatisch bestimmt.
    
    char c; // Ein char
    char c[3]; // Array aus 3 chars
    char c[3] = {'a','b','c'}; // Array aus 3 chars mit Initialisierung
    char c[] = {'a','b','c','d'}; // Array aus chars mit Initialisierung, Länge (4) wird automatisch bestimmt.
    char c[4] = "abc";  // Array aus 4(!) chars mit Initialisierung (inklusive Nullterminator)
    char c[] = "abcd";  // Array aus chars mit Initialisierung, Länge (5) wird automatisch bestimmt.
    
    const char *cptr = "abcd";  // Ein Zeiger auf das erste Zeichen des Zeichenkettenliteral "abcd" und somit ganz was anderes als ein Array. 
                                // Arrays sind keine Zeiger, Zeiger sind keine Arrays.
    char *cptr = "abcd";        // Das gleiche ohne const-correctness. Ist aus Kompatiblitätsgründen erlaubt,
                                // sollte man aber besser nicht machen.
    

    klöklö schrieb:

    char *test = "Hallo Welt";
    

    [...]

    Ersteres verhält sich wie ein Array,

    Nein, es verhält sich wie ein Zeiger auf den Anfang eines Arrays.



  • Es ist ja auch ein Zeiger auf den Anfang eines Arrays.
    Aber es verhält sich wie ein const-Array. Zugriff, aber keine Änderung. Dazu hat man noch Pointergedöns wie Inkrement und Dekrement, Dereferenzierung, etc.


  • Mod

    Nathan schrieb:

    Es ist ja auch ein Zeiger auf den Anfang eines Arrays.
    Aber es verhält sich wie ein const-Array. Zugriff, aber keine Änderung. Dazu hat man noch Pointergedöns wie Inkrement und Dekrement, Dereferenzierung, etc.

    Kurz: Es verhält sich wie ein Zeiger! Erklär doch mal die Unterschiede zwischen Zeiger und Array.

    const char *p = "Hallo Welt";
    char c[] = "Hallo Welt";
    
    p = "Tschüss Welt";
    c = "Tschüss Welt";  // Oh oh
    
    p = p + 2;
    c = c + 2;   // Oh oh
    


  • sven1987h schrieb:

    Hallo,

    In php gibt es eine schöne funktion namens substr.
    Sie gibt einem ein zeichen an belibger stelle wieder.
    Gibt es was vergleichbares auch in c oder wie muss ich das angehen???

    Danke schonmal

    am ehesten trifft das die funktion strncpy.



  • SeppJ schrieb:

    Nathan schrieb:

    Es ist ja auch ein Zeiger auf den Anfang eines Arrays.
    Aber es verhält sich wie ein const-Array. Zugriff, aber keine Änderung. Dazu hat man noch Pointergedöns wie Inkrement und Dekrement, Dereferenzierung, etc.

    Kurz: Es verhält sich wie ein Zeiger! Erklär doch mal die Unterschiede zwischen Zeiger und Array.

    Im objektorientierten Sinne:
    Ein Array ist ein Adapter zu einem Zeiger mit eingeschränkter Funktionalität.



  • Ein Array ist ein Array und hat mit Zeigern erstmal überhaupt nix zu tun... 😉


  • Mod

    Nathan schrieb:

    Ein Array ist ein Adapter zu einem Zeiger mit eingeschränkter Funktionalität.

    Ich hab das nicht studiert, verstehe leider nicht, was das bedeutet.

    Was ich auch nicht verstehe: Worauf möchtest du damit hinaus? Ein Zeiger ist kein Array, sondern technisch ganz was anderes. Da sind wir uns soweit einig, oder? Arrays und Zeiger haben teilweise ähnliche Interfaces, aber unterscheiden sich in ein paar Punkten. Und zwar Punkten, mit denen man sich ordentlich zur Laufzeit auf die Schnauze legen kann (z.B. sizeof, aber auch Performanceaspekte). Und natürlich auch jede Menge Sachen, die beim einen oder beim anderen schon zur Compilezeit schiefgehen und man sich dann wundert, warum das nicht geht. Daher finde ich es sehr wichtig, einem Anfänger diese Unterschiede klar zu machen.



  • Ja, klar.
    Ein Array ist kein Zeiger, nur die "Interfaces" sind teilweise gleich.
    Und das ist auch alles, was ich meinte.

    Edit: Ich habs auch nicht studiert, das mit dem Adapter habe ich gerade erfunden.^^



  • Was war das doch noch im guten alten Cobol so einfach.
    01 feld1 pic x(80).
    01 feld2 pic x(80).
    01 feld3 pic x(80).
    01 feld4 pic x(80) value "Heute ist Montag".
    ...
    ..
    unstring feld4 delimited by space into feld1, feld2, feld3.

    ..
    und fertig. Ja die "alten" Sprachen haben nicht nur Nachteile, weshalb ich auch oft open-cobol verwende.



  • Und so flexibel ... Selbst wenn in feld4 ein paar mehr spaces wären, würden nur die drei Felder gefüllt. Der Rest fiele einfach unter den Tisch ...



  • Und wer braucht schon jemals mehr als 80 Zeichen...



  • dot schrieb:

    Und wer braucht schon jemals mehr als 80 Zeichen...

    ich
    🙂



  • Auch in Cobol gehen mehr wie 80 - war nur ein Beispiel.



  • pferdefreund schrieb:

    Auch in Cobol gehen mehr wie 80 - war nur ein Beispiel.

    Und wieviel nimmt man im guten alten COBOL für einen String dann am besten so? 🤡


  • Mod

    Interessanter fände ich, wie man auf Bellis berechtigten Einwand reagiert. Nichts gegen die Sprache an sich (da ich sie nicht gut genug kenne), aber ich wüsste gerne ob und ,wenn ja, wie umständlich/einfach das geht. Das muss unser Cobol-Fan beantworten, wenn die Behauptungen Bestand haben sollen:

    Was war das doch noch im guten alten Cobol so einfach.

    Ja die "alten" Sprachen haben nicht nur Nachteile



  • Naja, das Hauptproblem hatten wir schon mal in anderem Zusammenhang:
    Man kann (zumindest in Cobol85 auf dem guten IBM-Mainframe) nicht dynamisch Speicher allokieren.
    Ich hab hier mittlerweile einen Compiler für Windows/Linux, der aus dem Cobol-Quellcode Java-Quellcode macht, der dann wiederum zu Java-Bytecode weiterkompiliert wird, der bietet sowas, ich bezweifle allerdings, dass das Cobol-Standard ist, kann es aber nicht beschwören.


Anmelden zum Antworten