Problem bei Variablenzuweisung eines *char[]



  • Hallo Zusammen,

    Habe folgendes Problem. Möchte eine Liste in Vorname und Nachname aufteilen. Bei der Zuweisung eines einzelnen Buchstaben aus der Liste, bringt mir aber einen Fehler, siehe Fettdruck. Woran liegt das Problem?

    void umstellen(char* liste1[], char* liste2[]) {
    
        int i = 0;
        int j = 0;
         char* nachname[MAX];
        char* vorname[MAX];
    
    while(liste1[i] != NULL) {
    
    while(!isspace(liste1[i][j]) && liste1[i] != NULL) {
    vorname[i][j] = liste1[i][j]; [b]// Hier bringt er den Fehler, Call-Stack-Fehler[/b] (
    j++;
    }
    
    if(isspace(liste1[i][j])) {
    
    int x = 0;
    for(x = j; x < strlen(liste1[i]); x++)
    nachname[i][x+1] = liste1[i][x+1];
    
    }
    
    i++;
    }
    
    }
    int main(void) {
    
    char *liste1[MAX] = {"Otto Meier", "Helga Schulze",
    "Hans Lehmann", NULL},
    *liste2[MAX];
    
    umstellen(liste1, liste2);
    
    return 0;
    }
    


  • Goalman schrieb:

    Woran liegt das Problem?

    vorname (genau wie nachname) ist ein Array von uninitialiserten Zeigern, die irgendwo in den Speicher zeigen. Da solltest du dich nicht wundern, dass es beim Zugriff knallt.



  • *liste2[MAX]; ist ein Array aus Zeigern auf char.
    Nur zeigen diese Zeiger irgendwo hin. Und wo sie hinzeigen ist kein für die Strings reservierter Speicher.

    Und Nutze die C/C++ oder cpp Tags. Dann wirds bunt.



  • Wo sollen die separierten Vor-und Nachnamen denn abgespeichert werden?
    In funktionslokalen Variablen scheint mir nicht so der Bringer.



  • Die beiden Variablen Vorname und Nachname sind sozusagen als Hilfsvariablen da. Dort will ich die zusamengesetzten Namen in der liste1 parsen / trennen und den jeweiligen Vornamen in die Variable vorname reinschreiben und den jeweilgen Nachnamen in die Variable Nachname reinschreiben. Danach möchte ich mittels der Funktionen strcpy und strcat die Kombinationen wieder in die Liste1 einfügen, nur diesmal sollte der Vor-und der Nachname vertauscht werden, also z.B. der Name Otto Meier, sollte dann in der Liste Meier Otto heißen.
    Wie mache ich das nun am Besten?



  • #include <stdio.h>
    #include <stdlib.h>
    
    void umstellen(char **liste1, char (*liste2)[100]) {
    
    char nachname[100];
    char vorname[100];
    
    while( *liste1 )
      sscanf(*liste1++,"%s%s",vorname,nachname),
      sprintf(*liste2++,"%s %s",nachname,vorname);
    }
    
    int main()
    {
    
    char *liste1[] = {"Otto Meier", "Helga Schulze", "Hans Lehmann", NULL}, liste2[3][100];
    
    umstellen(liste1, liste2);
    
    return 0;
    }
    

    Schaue dir Zeile 18+4 an und versuche zu verstehen bzw. lerne.
    sscanf/sprintf sollte wohl einfacher zu verstehen sein.



  • Ich wollte es aber eig. nicht mit vorgefertigten Funktionen machen, außerdem bringt er mir mit sscanf und ssprintf auch nicht das gewünschte Ergebnis :(. Bei einfachen Zeigern bekomme ich das Tauschverfahren mit strcpy hin, aber bei Zeiger auf Zeiger auf Zeichen, weiß ich es nicht, wie ich es anstellen soll! :(. So sollte das Ergebnis ausschauen:

    Liste 1
    Otto Meier
    Hans Lehmann
    Helga Schulze

    void umstellen(char *liste1[], char * liste2[])
    ------------------------------------------------>

    Liste 2
    Meier Otto
    Lehmann Hans
    Schulze Helga



  • Das was du benutzt sind doch aber Zeiger auf Zeiger auf Zeichen

    char *liste1[] = {"Otto Meier", ..., NULL}; // ist ein Array aus Zeigern auf char.
    

    Genau so hat auch Wutz seine liste1 definiert.

    Der Speicher in dem die Zeichen/Strings stehen, werden beim compilieren belegt und die Adressen richtig in das Array eingetragen (wegen der Initialisierung).

    liste1[0] gibt dir den ersten String.
    liste1[0][0] gibt dir das erste Zeichen vom ersten String.
    

    Dagegen ist liste2 von Wutz ein einfaches Array

    liste2[3][100];  // ist ein 2D-Array aus 3 * 100 Zeichen
    
    liste2[0] gibt dir den ersten String (mit bis zu 99+1 Zeichen).
    liste2[0][0] gibt dir das erste Zeichen vom ersten String.
    

Anmelden zum Antworten