【问题标题】:fgets() / gets() problem while taking input for N strings. Not taking input at initial position [duplicate]输入 N 个字符串时出现 fgets() / gets() 问题。在初始位置不接受输入[重复]
【发布时间】:2019-03-31 22:40:28
【问题描述】:

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

我的代码:

#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() 不起作用。

【问题讨论】:

  • 首先,永远不要永远使用gets。它是a dangerous function,因此甚至已从 C 标准中删除。
  • 也试过fgets。问题是它没有输入 str[0]

标签: c multidimensional-array fgets c-strings gets


【解决方案1】:

你需要消耗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 ");

【讨论】:

  • 我不明白。
  • @Someprogrammerdude 在另一个答案中给出了很好的解释。
  • @asynts,这就是我建议fgetsstrtol 的原因,您还可以使用第二个参数检查输入是否有效,但这留给 OP 练习 :)
【解决方案2】:

问题不在于fgets(或gets)。问题是您之前致电scanf

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

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

【讨论】:

  • 我认为,最大的问题是 - 我在学习 C 时使用了错误的文本。:(
  • 社区会帮助我选择正确的来源吗?
  • @Vartika 选择[c]标签并点击“了解更多”,有很多技巧包括资源和书籍:stackoverflow.com/tags/c/info
猜你喜欢
  • 2022-06-14
  • 1970-01-01
  • 2014-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-08
  • 1970-01-01
  • 2020-07-24
相关资源
最近更新 更多