【问题标题】:scanf with variable arguments (C lang)带有可变参数的 scanf(C 语言)
【发布时间】:2020-01-22 17:02:44
【问题描述】:

我的输入如下。

3 8 9 3
4 2 4 0 3
5 1 5 9 3 1
0
1 5

如您所见,每行的第一个数字表示该行中剩余的输入数。

如何通过 scanf 获取所有输入? 或者请让我知道一些新的东西。

【问题讨论】:

  • 你为什么不使用循环?
  • 读取一个整数。阅读更多。在尝试使用它设置的变量之前,不要忘记总是检查scanf() 的返回值以查看它是否成功。
  • 请提供minimal reproducible example 以显示您已经知道和不知道的内容。请查看C book list
  • scanf 对于这项工作来说是一个非常糟糕的工具。一方面,它是基于流的,而不是基于行的。也就是说,它不关注行边界——就它而言,换行符只是另一个空白字符。因此,虽然您可以编写一些简单的代码来 (a) 读取行首的数字并 (b) 使用循环来读取更多的数字,但它会很高兴地读取两行输入 10 1 2 3 4 后跟 @ 987654327@ 作为 一个 组数字。
  • 放大@JohnBollinger 所说的内容,如果你问如何通过一个 调用scanf 来阅读整行,你以某种方式告诉scanf 多少%d 的使用基于线上的第一个数字,我会说这是不可能的。

标签: c scanf stdin


【解决方案1】:

正如 cmets 中所述,scanf() 的问题是(除其他外)它处理换行符的方式。但是,sscanf() 函数(从字符串中读取)没有这个问题!因此,根据您想要实现的具体目标,也许下面的代码会有所帮助:

#include <stdio.h>

int main()
{
    int a[5], n = 0, given;
    char buffer[200];
    while (n >= 0) {
        printf("\nEnter n and a list of numbers: ");
        fgets(buffer, 200, stdin);
        printf("Input was: %s", buffer);
        n = -1;
        given = sscanf(buffer, "%d %d %d %d %d %d", &n, &a[0], &a[1], &a[2], &a[3], &a[4]);
        if ((given < 1) || (given != n + 1)) printf("Invalid input!\n");
    }
    return 0;
}

我并不是说它是一个理想的解决方案,或者你甚至可以使用它,但它可能会给你一些关于下一步该去哪里的线索。

告诉我你是怎么找到它的。

【讨论】:

  • @SteveSummit 确实,但我用它来保持代码简单易读。如果我使用更大的数字,sscanf(…) 行会开始显得笨拙。正如我所说,这不是一个理想的解决方案 - 而是一个关于可能的建议/提示/指针。
  • 我记错了零。
猜你喜欢
  • 1970-01-01
  • 2019-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-29
  • 2013-12-12
相关资源
最近更新 更多