使用gets函数在数组中输入字符串

时间:2014-01-18 17:18:05

标签: c string input gets

#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

我无法理解为什么读取空字符串。

2 个答案:

答案 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);