2014-01-18 35 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); 
相关问题