【问题标题】:Unable to properly read integers from input via fgets()无法通过 fgets() 从输入中正确读取整数
【发布时间】:2016-08-21 01:08:54
【问题描述】:

我目前正在练习读取用户的输入,我正在使用 fgets 读取输入,但似乎有问题。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
    int N = 0;
    char ar[2];
    fgets(ar, 2, stdin);
    N = atoi(ar);
     char arr[N][22];

    // for loop automatically runs automatically
    for(int i = 0; i< N; i++){ 
            printf("i is %d\n", i);
            fgets(arr[i], 22, stdin);
    }
    return 0;
}

首先,我使用 fgets 读取一个整数,然后使用 atoi 将其转换为整数。然后使用该整数,我循环了 N 次,但是由于某种原因,输入流中似乎还剩下一些东西,这导致我的 for 循环自动运行了两次。

编辑:

输入:

5

输出(自动):

我是 0

我是 1

【问题讨论】:

  • 比如我输入5,for循环会因为某种原因自动运行两次。
  • 要读取整数,请改用scanf
  • 我已经用“编辑”更新了我的帖子以显示示例
  • 你的数组太小了。至少char ar[3];(因为包含换行符)
  • 请注意,数组char ar[2]; 只能包含一个字符(大概是一个数字)加上一个终端空值。您应该使用更大的缓冲区大小(例如char ar[4096];)来读取该行,然后您可以在其上使用atoi()。就目前而言,您在缓冲区中留下一个换行符,因此循环内的下一个 fgets() 将读取换行符,而无需等待您输入更多内容。您应该在每次使用它时测试来自fgets() 的返回。您应该在使用 N 声明您的 VLA(可变长度数组)之前验证它。

标签: c input int fgets


【解决方案1】:

您的输入数组不够大。

如果您输入单个数字,则该数字和换行符将在输入缓冲区中。然后fgets 将 1 个字符(即 2 - 1)读入缓冲区(因为这已经足够了)并添加空终止符。所以换行符留在缓冲区中。

使ar 缓冲区足够大以存储您可能输入的任何数字以及换行符的空间。 10 的大小应该足够了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-09
    • 1970-01-01
    • 2020-06-08
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多