【问题标题】:fgets() not working properlyfgets() 无法正常工作
【发布时间】:2016-03-04 21:48:46
【问题描述】:

我正在编写一个简单的代码,我需要输入一个数字 n,然后输入 n 个格式为“string int”的字符串(例如 hello 100)。我使用fgets() 函数来获取字符串输入。除第一个迭代外,该代码似乎对所有迭代都运行良好。第一次迭代似乎有一个空的 cmd 输入,但其余的迭代运行良好。我尝试了各种功能,如scanf()gets(),但问题仍然存在。谁能指出问题?

#include <stdio.h>
#include <stdlib.h>

int main() {
    int num_msg, i;
    printf("Hello, How many strings should I read?: ");
    scanf("%d", &num_msg);

    for (i = 0; i < num_msg; i++) {
        int child;
        char cmd[100], msg[100];
        printf("Message %d (<msg> <int>):", i + 1);

        if (fgets(cmd, sizeof(cmd), stdin)) {
            //printf("cmd %s\n", cmd);
            sscanf(cmd, "%s %d %*s", msg, &child);  //separates string and int
            printf("%s %d \n", msg, child);  //prints them
        }
    }
}

【问题讨论】:

  • 你能用 scanf("%d\n"... 删除它吗?
  • 请参阅stackoverflow.com/a/34498302/434551 以获取忽略该行其余部分的功能。
  • @ArifBurhan 我这样做了,它现在接受输入,但输入是在循环中的 print 语句之前接受的。
  • @ArifBurhan,使用"%d\n""%d " 不仅会消耗换行符,还会消耗下一行中的任何空白字符。太贪心了。
  • @ArifBurhan,你是说fgets()吗?如果没有,你应该改变你的编码习惯。

标签: c stdin fgets


【解决方案1】:

你需要消耗\n后面的scanf()读取的数字。

scanf() 格式的末尾添加\n 是不合适的,因为它会消耗所有空格字符并一直请求输入,直到输入中出现非空格字符。

一种快速而肮脏的方法是将scanf替换为:

scanf("%d%*c", &num_msg);

%*c 读取单个字符并且不存储它。

您也可以将其存储到 char 变量中并验证它确实是 '\n'

忽略所有字符的通用方法,包括换行符:

scanf("%d", &num_msg);
int c;
while ((c = getchar()) != EOF && c != '\n')
    continue;

您还应该检查scanf 的返回值,以验证数字是否正确转换。

【讨论】:

  • 成功了!非常感谢你!我知道问题与 scanf() 函数中的换行符有关,所以我使用了 scanf("%d\n") ,它接受了输入但弄乱了打印顺序。 %*c 完美运行!
  • 哦,对不起,我忘了这样做。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-01
  • 2012-07-11
  • 2018-04-08
  • 2017-04-20
相关资源
最近更新 更多