#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
我无法理解为什么读取空字符串。
答案 0 :(得分:3)
scanf("%d", &n);
从标准输入读取整数。跟随该整数的任何内容,尤其是在4
之后键入 Enter 时输入的新行,等待下一个输入例程读取,在本例中为第一个{{ 1}}。
你有一个空白行,因为这是你在gets()
之后给出的。
这是你问到的问题的直接原因,但你遇到了更大的问题。
从不使用4
功能。它不会防止输入比您正在读取的数组更长,并且无法安全使用。这就是为什么它已从2011 ISO C标准的语言中删除。
您可以使用gets
读取一行输入,然后使用fgets
从内存中的行中提取整数。与sscanf
不同,fgets
会将gets
留在您的数组中,因此您必须处理该问题(尽管您在阅读'\n'
时可以忽略它)。阅读这两个函数的文档,并注意它们返回的值。 (他们有一些问题,但你现在不需要担心。)
答案 1 :(得分:0)
将scanf()
与fgets()/gets()
混合是有问题的。
建议使用fgets()
代替gets()
gets()
为dead。
// scanf("%d",&n);
char buf[50];
fgets(buf, sizeof buf, stdin);
sscanf(buf, "%d", &n);