2014-01-18 34 views
0
#include<stdio.h> 
#include<string.h> 
int main() 
{ 
    char name[10][30]; 
    int i,n; 
    printf("How many names?\n"); 
    scanf("%d",&n); 
    printf("Enter names\n"); 
    for(i=0;i<n;++i) 
     gets(name[i]); 
    printf("\n The names are\n"); 
    for(i=0;i<n;++i) 
     printf("%s\n",name[i]); 
} 

我正在嘗試按順序對人員的全名進行排序。所以我讀取了所有名字並將其名稱存儲在一個字符串數組中。但問題是當這個程序執行時:使用獲取函數的數組中的字符串輸入

How many names 
4 
Enter names 
john G 
susan sing 
puskar 
The names are 

john G 
susan sing 
puskar 

我不明白爲什麼空字符串被讀取。

回答

3
scanf("%d", &n); 

從標準輸入讀取的整數。在該整數之後的任何內容,特別是您輸入時輸入的新行4之後輸入,等待下一個輸入例程(本例中爲第一個gets())讀取。

你得到一個空行,因爲這是你在4後給它的。

這是您問到的問題的直接原因,但是您遇到了更大的問題。

從不使用gets函數。它不會防止輸入比您正在讀取的數組長,並且無法安全使用。這就是爲什麼從2011年ISO C標準中刪除它的原因。

您可以使用fgets來讀取輸入行,然後使用sscanf從內存中的行中提取整數。 fgets,與gets不同,將'\n'留在您的陣列中,因此您必須處理該問題(儘管您在閱讀n時可以忽略它)。閱讀這兩個函數的文檔,並注意它們返回的值。 (他們有一些自己的問題,但現在你不必擔心這個問題。)

0

混合scanf()fgets()/gets()是有問題的。

建議使用fgets()而不是gets()作爲gets()dead

// scanf("%d",&n); 
char buf[50]; 
fgets(buf, sizeof buf, stdin); 
sscanf(buf, "%d", &n); 
相關問題