【问题标题】:How to read an unknown quantity of integers from console?如何从控制台读取未知数量的整数?
【发布时间】:2015-12-03 23:36:30
【问题描述】:

我有这样的条目:

0 5 260
1 0 -598
1 5 1508
2 1 -1170

我以前不知道我会得到多少(控制台)输入,所以我必须阅读直到没有留下任何条目。

我从这样的代码开始:

int a, b, c;
while(scanf("%d %d %d", &a, &b, &c)!=EOF){
    // do stuff here
}

但它永远不会停止要求新的输入。

然后,我看到其他帖子中的人建议这样做:

int a, b, c;
while(scanf("%d %d %d", &a, &b, &c)==1){
    // do stuff here
}

在这种情况下,它甚至没有进入while。

有谁知道我做错了什么?

【问题讨论】:

  • 使用while(scanf("%d %d %d", &a, &b, &c) == 3) {,完成后输入“退出”。然而,这是一个广泛的答案。你想如何表示没有更多的信号?空行、Ctrl-D、“退出”等?

标签: c input scanf


【解决方案1】:

一种方法:继续请求输入,直到输入关闭 (EOF) 或遇到某些问题。 (输入的行无效)

下面使用fgets()读取一行。

然后," %n" 检测扫描停止的位置。如果扫描没有到达%nn 的值仍然是 0。否则它会在buffer 中获得扫描停止的偏移量,希望它是在空字符'\0'

char buffer[100];
while (fgets(buffer, sizeof buffer, stdin)) {
  int n = 0;
  sscanf(buffer, "%d%d%d %n", &a, &b, &c, &n);
  if (n == 0) {
    fprintf(stderr, "3 int were not entered\n");
    break;
  }
  if (buffer[n] != 0) {
    fprintf(stderr, "Extra input detected.\n");
    break;
  }
  // do stuff here with a,b,c
}

有很多方法可以解决这个问题。

【讨论】:

  • 成功了!谢谢! 但是由于它是一个自动提交系统并且它现在不在线,我无法检查是否会有额外的行或其他东西来标记输入的结束。但它需要这样的东西,对吧?否则,就无法知道何时将输出返回给用户,对吧?
  • @plethora 如前所述,“有很多方法可以解决这个问题。”包括char sentinel; if(sscanf(buffer, "%d%d%d %c", &a, &b, &c, &sentinel)==3) good();,如果有额外的,它将返回 4。也非sscanf() 方式。我发现" %n" 很简单,添加到格式的末尾很方便。
  • @plethora Deeper:许多用户只对 3 种输入中的前 2 种感兴趣:1)预期的带有数据的输入 2)最后一个表示没有更多的输入,而不是 3)没有的输入匹配前两个。健壮的代码检测组 #3。
  • 知道了... "%n" 方法确实很棒!
  • @plethora 确保在" %n" 中有一个空格,以便首先使用' ''\n' 等尾随空格,这通常不是使输入无效的好理由。
【解决方案2】:
while(scanf("%d %d %d", &a, &b, &c)==1)

表示“如果scanf() 只成功读取了一个值,则继续循环。”

因此,如果您输入0 junk 之类的内容,scanf() 只会读取 1 个数据,并且会进入循环一次。

尝试使用

while(scanf("%d %d %d", &a, &b, &c)==3)

scanf() 成功读取三个值时让它进入循环,这是预期的。

【讨论】:

    猜你喜欢
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多