【问题标题】:What would be the best way to get multiple inputs in c?在c中获得多个输入的最佳方法是什么?
【发布时间】:2022-01-13 16:53:56
【问题描述】:

我有一个任务是获取输入列表并使用它(使用本身并不重要)。 输入将仅以 EOF 结束。我需要获取一个数字列表并填充一个大小为 n 的数组。每个数字都用白色字符分隔。我的输入也需要检查,因为它没有被承诺它是有效的。

我有几种方法可以做到这一点,我想知道什么是最好的以及为什么。 (也许我什至没有考虑最好的解决方案,所以非常欢迎任何建议)

我用的是 ubuntu。

解决方案 1: 在检查白色字符以分隔数字时使用 getchar() 直到 EOF。

解决方案 2: 使用 scanf() 做类似的事情:

char str[256];

while (scanf("%s", str) != EOF)
{
    // Check the input and add to the array.
}

我认为这是最好的解决方案,但问题是我需要按两次 control + d 才能结束输入并且它无效。

解决方案 3: 使用 fgets() 并读取缓冲区并使用缓冲区。我认为这会使问题复杂化,因为一个整数可以跨 2 个缓冲区拆分。

感谢所有帮助者。

【问题讨论】:

  • 每行输入一个数字吗?还是每行任意数量的数字,空格分隔和多行?如果输入只是数字,为什么不scanf( "%d", &number) 为每个数字(整数)或%g 浮点数?
  • 您不需要“按两次 control + d”。您可以以非交互方式传递输入; echo 1 3 5 | ./a.out 或从文件重定向。如果您确实以交互方式传递输入,则使用 ^d 两次关闭输入流没有任何无效。不过,您可能不必这样做,<ret>^d 也可以正常工作。
  • 由于输入可能无效,scanf %d 将不起作用,因为它会挂在非数字上。使用 fgets 或 scanf %s

标签: c ubuntu input stdio


【解决方案1】:

通常,使用scanf 验证输入很困难。但是对于像这样的简单输入,您可以这样做:

while( scanf("%d", &n) == 1 ){
    /* add n to the array. */
}
if( ferror(stdin) ){
    fprintf(stderr, "Read error\n");
} else if( ! feof(stdin) ){
    fprintf(stderr, "Invalid input\n");
}

while 循环将在 EOF 或无效条目时终止。 feof() 将决定输入流是否关闭。

【讨论】:

    猜你喜欢
    • 2018-02-03
    • 1970-01-01
    • 2010-11-25
    • 2022-01-12
    • 2011-02-28
    • 2017-05-10
    • 2019-04-21
    • 2011-07-05
    • 2017-11-16
    相关资源
    最近更新 更多