2017-12-03 195 views
0

所以我想建立一個簡單的程序來輸入使用結構的數據。結構陣列;輸入多個字符串

我原來的計劃是這樣的:

#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; 
} 

我的測試輸入是:

2 
1 Name1 
2 Name2 

這是工作,但只有當輸入正確的數據。 但是當我嘗試在我的結構中使用更多的字符串時,它開始變得混亂。例如這樣的事情是行不通的:

#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; 

}

我明白,所以我試圖用的getchar這個問題必須躺在scanf函數的使用字符串輸入()。我認爲這樣的事情可能會奏效。

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

雖然它不工作。在這一點上,我感到困惑,我不確定有什麼問題。我的意思是我想輸入的東西,如:使用結構

1001傑夫中號No.2_road_city

,但我感到困惑應該如何準確完成。

+1

啓用警告是第一個步驟之前,請在計算器'的scanf( 「%s」 時,與S [I] scanf(「%s」,&s [i] .gender);'='scanf(「%s」,s [i] .name);'...和其他微不足道的錯誤。 >'scanf(「%c」,&s [i] .ge nder);'etc – Stargateur

+1

檢查每個'scanf()'調用以確保它返回正確的數字(每次讀取一個字段時爲1)。如果它不返回1,則說明你有問題。將N個呼叫合併爲一個可能會更好 - 您可以這樣做。用['fgets()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/fgets.html)或POSIX ['getline()'](http:/ /pubs.opengroup.org/onlinepubs/9699919799/functions/getline.html),然後用'sscanf()'處理該行。 –

回答

-1

fflush(stdin); 使用的scanf(「%S」 .... 它清除鍵盤緩衝區之前。兩個連續的scanf語句,而不刷新緩衝區使第二成包含來自第一輸入一個新行/回車只有

另一個問題:。你用scanf("%s"一個字符變量(CHAR性別)更改爲scanf("%c",&s[i].gender);

+0

'fflush(stdin);'是未定義的行爲。 – Stargateur

+0

不完全如此。閱讀本文(最新發布)https://stackoverflow.com/questions/2979209/using-fflushstdin –

+0

「標準C和POSIX將fflush(stdin)留作未定義行爲」,這是完全正確的。 – Stargateur