fgets()无法正常工作

时间:2016-03-04 21:48:47

标签: c stdin fgets

我正在编写一个简单的代码,我需要输入一个数字n,然后输入n个字符串格式" string int" (例如,你好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
        }
    }
}

1 个答案:

答案 0 :(得分:4)

您需要使用\n所读取数字后面的scanf()

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

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

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

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

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

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

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

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