2017-12-03 4 views
0

Also würde ich gerne ein einfaches Programm zur Eingabe von Daten mit Hilfe von Strukturen erstellen.Array von Strukturen; Eingabe mehrerer Strings

Meine ursprüngliche Programm sah wie folgt aus:

#include <stdio.h> 
#include <stdlib.h> 

struct student { 
    int num; 
    char name[20]; 

}; 

int main() 
{ 
    int size, i; 
    scanf("%d", &size); 
    struct student s[size]; 
    for(i=0; i < size; i++){ 
     scanf("%d", &s[i].num); 
     scanf("%s", &s[i].name); 

    } 

    for(i=0; i < size; i++){ 
     printf("no.:%d\n", s[i].num); 
     printf("name:%s\n", s[i].name); 

    } 

    return 0; 
} 

Mein Testeingang wäre:

2 
1 Name1 
2 Name2 

Es funktionierte aber nur, wenn die Daten korrekt eingegeben wurde. Aber als ich versuchte, mehr Strings in meiner Struktur zu verwenden, begann es unordentlich zu werden. Zum Beispiel so etwas wie dies funktioniert nicht richtig:

#include <stdio.h> 
#include <stdlib.h> 

struct student { 
    int num; 
    char name[20]; 
    char gender; 
    char address[20]; 
}; 

int main() 
{ 
    int size, i, j; 
    scanf("%d", &size); 
    struct student s[size]; 
    for(i=0; i < size; i++){ 
     scanf("%d", &s[i].num); 
     scanf("%s", s[i].name); 
     scanf("%s", s[i].gender); 
     scanf("%s", s[i].address); 
    } 

    for(i=0; i < size; i++){ 
     printf("no.:%d\n", s[i].num); 
     printf("name:%s\n", s[i].name); 
     printf("gender:%s\n", s[i].gender); 
     printf("address:%s\n", s[i].address); 
    } 

    return 0; 

}

Ich verstand, dass Problem Verwendung von scanf für String-Eingang liegt muss also versuchte ich getchar() zu verwenden. Ich dachte, so etwas könnte funktionieren.

for(i=0; i < size; i++){ 
     int j=0; 
     while((s[i].name[j]=getchar()) != ' '); 
      j++; 
     s[i].name[j] = '\0'; 
} 

Es funktioniert aber nicht. An diesem Punkt wurde ich verwirrt und ich bin nicht wirklich sicher, was falsch läuft. Ich meine, ich möchte Eingang so etwas wie:

1001 Jeff M No.2_road_city

durch die Struktur, aber ich bin immer verwirrt, wie genau es getan werden sollte.

+1

aktiviert Warnung ist der erste Schritt, bevor auf Stackoverflow fragen 'scanf ("% s", & s [i] .name); '=>' scanf ("% s", s [i] .name); '... und andere triviale Fehler.' scanf ("% s", & s [i] .gender); '= > 'scanf ("% c ", & s [i] .ge nder); 'etc – Stargateur

+1

Überprüfen Sie jeden' ​​scanf() '- Aufruf, um sicherzustellen, dass er die richtige Nummer zurückgibt (1, wenn Sie bei jedem Aufruf ein Feld lesen). Wenn es 1 nicht zurückgibt, hast du ein Problem. Es könnte besser sein, die N-Aufrufe in einem zu kombinieren - das können Sie tun. Es kann auch besser sein, Zeilen mit ['fgets()'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/fgets.html) oder POSIX ['getline()'] zu lesen (http://pubs.opengroup.org/onlinepubs/9699919799/functions/getline.html) und bearbeite dann die Zeile mit 'sscanf()'. –

Antwort

-1

setzten fflush(stdin); bevor ein scanf („% s“ unter Verwendung .... Es löscht den Tastaturpuffer. Zwei aufeinanderfolgende Scanf Anweisungen ohne die Puffer Spülen die zweiten bewirkt einen Neuen-Zeile/Wagenrücklauf von der ersten Eingabe enthalten nur

ein weiteres Problem:... Sie verwenden scanf("%s" für ein char-Variable (char Geschlecht) ändern zu scanf("%c",&s[i].gender);

+0

'fflush (stdin);' ist undefiniertes Verhalten. – Stargateur

+0

nicht genau richtig. Lesen Sie dies (letzter Beitrag) https://stackoverflow.com/questions/2979209/using-fflushstdin –

+0

"Standard C und POSIX verlassen fflush (stdin) als undefined Verhalten", es ist genau richtig. – Stargateur

Verwandte Themen