如何在循环中使用scanf读取数据直到EOL?

时间:2013-05-22 15:38:49

标签: c function scanf space eof

我遇到的问题如下:

我需要使用标准库在C中创建一个函数。 此函数应从标准输入读取数据,如下所示:value1 value2 value3

是谁的类型是uint32_t。

问题是我不喜欢那么多数据会进入,我可以在用户输入不符合给定格式的行时,或者输入带空格的行或进入EOF。

我正在阅读页面中类似问题的几个答案,这是我所做的代码:

int main(void) {
uint32_t value1, value2, value3;
int ret = 3;
char ch;
while (true) {
    printf("Enter the data:\n");
    ret = scanf("%u %u %u", &value1, &value2, &value3);
    if ((ret != 3) || (getc(stdin) == EOF) ||
        (getchar() == ' ')) {
        break;
    }
    printf("\nYou entered: %u, %u, %u\n", value1, value2, value3);
}
printf("Finish..");
return 0;
}

但工作不正常。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

推荐:

  • 使用fgets()
  • 读取该行
  • 使用fgets()阅读sscanf()填充的行,类似于当前使用scanf()的方式

这有利于读取始终行,而如果scanf()失败,则发布的代码需要丢弃该行,例如无效输入。

示例:

printf("Enter the data:\n");
char line[1024];
while (fgets(line, 1024, stdin))
{
    uint32_t values[3];
    if (sscanf(line, "%u %u %u", &values[0], &values[1], &values[2]))
    {
        printf("\nYou entered: %u, %u, %u\n", values[0], values[1], value[2]);
        break;
    }
    fprintf(stderr, "Invalid input, retry...\n");
}