Zeichenkette einlesen und in einem Array speichern



  • [code="c"]

    Ich möchte eine Zeichenkette, die ich mit "scanf(...)" eingelesen habe in einem Array einer Struktur speichern. Wie geht man da vor? Ich muss ein Programm in C schreiben, das Personendaten einlesen und ausgeben kann. 🙂


  • Mod

    Warum nicht gleich das Array als Ziel von scanf nehmen?

    Ansonsten: Dann muss man eben eine Zeichenkette kopieren. Vielleicht gibt es ja eine Funktion dafür...



  • scanf ("%s", &Person[a].Vorname);
    Muss das ungefähr so sein?


  • Mod

    Ungefähr ja, aber auch nur ungefähr. Da stimmt etwas nicht, wenn man mal vernünftige Definitionen für dein struct annimmt. Schalte die Warnungen deines Compilers an (sollte man sowieso immer machen), der wird dir bestimmt etwas in der Richtung sagen, dass er da die Adresse eines Arrays erhalten hat, wo er eigentlich die Adresse eines char erwartet hätte.

    Lass dich nicht davon verwirren, dass das so wahrscheinlich trotzdem funktioniert. In C funktioniert vieles zufällig auch dann, wenn es falsch ist.



  • Ich habe die Warnungen des Compilers eingeschaltet, aber der sagt, dass nicht falsch ist. Und wenn ich die Zeichenkette ausgeben möchte kommt eine Zahl anstatt eines Wortes heraus.



  • Marmelade schrieb:

    Ich habe die Warnungen des Compilers eingeschaltet, aber der sagt, dass nicht falsch ist. [...]

    Code?



  • Hier ist der gesamte Quelltext:

    struct Personendaten{
    char Vorname;
    char Nachname;
    int Alter;
    int Groesse;
    int Gewicht;};
    int a;
    int b;
    int c;
    int d;
    struct Personendaten Person[20];
    for(a=0; a<=20; a++){
    scanf ("%s", &Person[a].Vorname);
    scanf ("%s", &Person[a].Nachname);
    scanf ("%d", &Person[a].Alter);
    scanf ("%d", &Person[a].Groesse);
    scanf ("%d", &Person[a].Gewicht);
    for(c=0; c<=a; c++){
    printf("Vorname:");
    printf("%d\n", Person[c].Vorname);
    printf("Alter:");
    printf("%d\n", Person[c].Alter);
    printf("Groesse:");
    printf("%d\n", Person[c].Groesse);
    printf("Gewicht:");
    printf("%d\n", Person[c].Gewicht);
    }}}

    Könnt ihr mir sagen, was ich falsch gemacht habe?



  • Marmelade schrieb:

    [...] der sagt, dass nicht falsch ist. [...]

    komisch

    Daß (so gut wie) jedes C-Programm eine Funktion Namens main braucht weißt Du ... nicht?



  • Ich habe alles, was nach der main-funktion ist dort hineingeschrieben.



  • Marmelade schrieb:

    Hier ist der gesamte Quelltext:

    ...

    Könnt ihr mir sagen, was ich falsch gemacht habe?

    Du weisst schon was das Wort gesamt bedeutet 😕
    Und den Quelltext formatiert hier im Forum zeigen sollte dir auch möglich sein. 🙄

    Mindestens 3 (4) Sachen in deinem Quelltext machen nicht das was du dir vorstellst. Ich unterstelle das mal so. Wahrscheinlich sind da gar mehr Ungereimtheiten drin. Aber dazu müssten wir den gesamten Quelltext sehen. 🙄

    Lies dir in deinen Unterlagen aalles zu folgendem durch:

    scanf(...)
    

    Du willst 20 Personen anlegen und warum lassen deine Schleifen da mehr zu?



  • Marmelade schrieb:

    Hier ist der gesamte Quelltext:

    🙄

    Marmelade schrieb:

    Ich habe alles, was nach der main-funktion ist dort hineingeschrieben.

    Dann schaut Dein Programmm also so aus:

    #include <stdio.h>
    
    int main(void)
    {
    	struct Personendaten {
    		char Vorname;
    		char Nachname;
    		int Alter;
    		int Groesse;
    		int Gewicht;
    	};
    	int a;
    	int b;
    	int c;
    	int d;
    	struct Personendaten Person[20];
    	for (a = 0; a <= 20; a++) {
    		scanf("%s", &Person[a].Vorname);
    		scanf("%s", &Person[a].Nachname);
    		scanf("%d", &Person[a].Alter);
    		scanf("%d", &Person[a].Groesse);
    		scanf("%d", &Person[a].Gewicht);
    		for (c = 0; c <= a; c++) {
    			printf("Vorname:");
    			printf("%d\n", Person[c].Vorname);
    			printf("Alter:");
    			printf("%d\n", Person[c].Alter);
    			printf("Groesse:");
    			printf("%d\n", Person[c].Groesse);
    			printf("Gewicht:");
    			printf("%d\n", Person[c].Gewicht);
    		}
    	}
    }
    

    ?


  • Mod

    Nun ist zumindest klar, wieso der Compiler bei der speziellen Zeile

    scanf("%s", &Person[a].Vorname);
    

    keine Warnung wirft¹: Das wird durch andere Fehler an anderen Stellen zu korrektem C, nämlich dadurch, dass

    char Vorname;
    

    keine Zeichenkette ist. Was natürlich heißt, dass es trotzdem absolut nicht funktionieren wird, aber es ist technisch gesehen richtiges C. Es ist aber natürlich auch ein noch viel grundlegenderes Problem an deinem Lernstand, dass du versuchst, etwas mit Zeichenketten zu machen, aber nicht weißt, was eine Zeichenkette ist. Du musst unbedingt erst einmal ein paar Schritte zurück gehen, und die Grundlagen lernen.

    ¹: Sofern du sie denn überhaupt angeschaltet hast. Irgendwie glaube ich dir da nicht so recht.



  • Sind eben platzsparende Namen (Datenschutz und so) 😃

    Was du benötigst sind Arrays.



  • Marmelade schrieb:

    Hier ist der gesamte Quelltext:

    struct Personendaten{
    char Vorname;
    char Nachname;
    int Alter;
    int Groesse;
    int Gewicht;};
    int a;
    int b;
    int c;
    int d;
    struct Personendaten Person[20];
    for(a=0; a<=20; a++){
    scanf ("%s", &Person[a].Vorname);
    scanf ("%s", &Person[a].Nachname);
    scanf ("%d", &Person[a].Alter);
    scanf ("%d", &Person[a].Groesse);
    scanf ("%d", &Person[a].Gewicht);
    for(c=0; c<=a; c++){
    printf("Vorname:");
    printf("%d\n", Person[c].Vorname);
    printf("Alter:");
    printf("%d\n", Person[c].Alter);
    printf("Groesse:");
    printf("%d\n", Person[c].Groesse);
    printf("Gewicht:");
    printf("%d\n", Person[c].Gewicht);
    }}}

    Könnt ihr mir sagen, was ich falsch gemacht habe?

    Vorname und Nachname haben nur Platz für ein Zeichen. besser

    struct Personendaten{
    char Vorname[32];
    char Nachname[32];
    ...
    

    Jetzt sind es jeweils 32 Zeichen. Musst nur aufpassen, dass du nicht darüber hinaus schreibst. Kann sein, dass man bei scanf eine Maximallänge angeben kann. Musst du mal Doku gucken.



  • Zwei Blinde ergeben noch keinen Sehenden.
    Halte die Klappe wenn du doch nur Vermutungen äußerst.



  • ja es kann aber auch sein, dass das msdn besagt, dass man scanf nicht verwenden soll und der microsoft-compiler diesbezüglich eine warnung ausgibt.

    anderserseits kann es auch egal sein, weil konsolenprogramme eh nicht mehr wirklich benutzt werden und es bei dieser aufgabe wohl eher darum geht, irgendetwas in eine datenstruktur zu schreiben und von dort zu lesen. aber im hinterkopf behalten sollte man das dann schon.

    aber Vorname[32] hat nur 31 zeichen, weil man ja noch die 0 anhängen muss. wenn sich hinter Vorname jetzt eine variable continueloop befindet, bricht das programm bei 32 zeichen möglicherweise aus unerklärlichen gründen ab.



  • Wade1234 schrieb:

    aber Vorname[32] hat nur 31 zeichen, weil man ja noch die 0 anhängen muss. wenn sich hinter Vorname jetzt eine variable continueloop befindet, bricht das programm bei 32 zeichen möglicherweise aus unerklärlichen gründen ab.

    Daher muss man es so bauen, dass nur 31 Zeichen eingegeben werden können.
    scanf("%31s", Vorname); könnte hinhauen. Habe es selbst aber nicht ausprobiert.


Anmelden zum Antworten