获取 N 个字符串的输入时出现 fgets() / gets() 问题。在初始位置不接受输入

fgets() / gets() problem while taking input for N strings. Not taking input at initial position

我需要获取 n (用户输入) 字符串的输入。为此,我首先定义一个二维数组 char str[ ][ ].
我使用 for 循环从用户那里获取输入,并尝试了 gets()fgets() 两者。 在代码示例中,尽管我使用了 gets().
但它总是接受 n-1 个字符串的输入,即比用户想要输入的字符串少 1 个。
进一步检查后,我发现程序没有接受 0th string 的输入,即初始字符串。

我的代码:

#include <stdio.h>
int main(void){
int i, n;

printf("how many string you want to enter: ");
scanf("%d", &n);

char str[n][60];

printf("start entering strings:\n ");

for(i=0;i<n;i++){     
    gets(str[i]);     //have used here fgets() also
}

puts(str[0]);         //no output for Oth string
return 0;
}

输出:

how many string you want to enter:

用户输入 - 3

how many string you want to enter: 3
start entering strings:

最终输出:

how many string you want to enter: 3
start entering strings:
 abc
bcd

此处程序在仅输入 2 个字符串并且不为 puts(str[0]);

提供任何输出后终止

尽管使用 scanf() 作为 scanf("%s", str[i]); 的输入工作得很好。
我想知道为什么使用 gets()fgets() 没有工作.

您需要消耗 scanf 留下的剩余缓冲区:

scanf("%d", &n);
char str[n][60];
int c;
while ((c = fgetc(stdin)) != '\n' && c != EOF);
printf("start entering strings:\n ");

您可以使用 fgetsstrtol 而不是 scanf 来避免丑陋的刷新循环:

char buf[32];
int i, n = 0;

printf("how many string you want to enter: ");
if (fgets(buf, sizeof buf, stdin)) {
    n = (int)strtol(buf, NULL, 10);
}

char str[n][60];
printf("start entering strings:\n ");

问题不在于 fgets(或 gets)。问题是您之前调用 scanf.

当您使用 Enter 键结束数字输入时,该 Enter 键将被添加到输入缓冲区作为新队。所以在 scanf 读取数字后,输入缓冲区中剩下的下一个字符将是换行符。这是 fgets 将作为空行读取的第一个字符。所以它 确实 读取所有行,但第一行将被视为

这就是为什么您似乎 无法获得任何输出的原因,因为没有可打印的字符可供打印。你得到的只是一个空行。