【问题标题】:Use scanf() to read an unknown number of integers in c使用 scanf() 读取 c 中未知数量的整数
【发布时间】:2023-03-04 05:01:02
【问题描述】:

我需要读取未知数量的行,每行包含未知数量的整数,这个数字因行而异。

整数之间用一个空格隔开,行尾没有空格。

输出是所有整数的总和。

示例输入:

5
2 2
4 4 4
6 6
3 3

输出: 39

【问题讨论】:

  • 读取整行(例如使用fgets)。对于每一行,在循环中调用strtol 以提取下一个整数。如果您需要保存这些值以供以后处理,请使用指针和动态分配(和重新分配)。
  • 但是,取决于您应该如何处理这些数字,而您没有告诉我们,那么可以在循环中调用 scanf("%d", &number) 直到它返回不同的东西来自1。由于您没有告诉我们根本问题,您应该如何处理这些数字,因此很难为您提供一个好的单一解决方案。
  • @Balou 你不需要预读rows 号码。您需要一个循环,调用scanf 来读取一个int,检查它的返回值,只要返回值为1,将您刚刚读取的int 添加到正在运行的“sum”变量中.
  • 你关心每一行的整数个数吗?即,是否需要区分1 2 3\n4 5 6\n1\n2 3\n 4\n5\n6?如果空格的类型相关,使用scanf 会更困难。
  • scanf 具有 - 通常不受欢迎的 - 属性,它对待行内和行尾的换行符的所有空格完全相同。然而,对于这个特定的问题陈述,这正是我们所需要的。

标签: c scanf


【解决方案1】:

数字输入多行这一事实实际上是无关紧要的。基本上你只想总结用户输入的数字,直到输入流结束。

你可能想要这样的东西:

#include <stdio.h>

int main() {    
  int sum = 0;
  int number;

  while (scanf("%d", &number) == 1)
  {
    sum += number;
  }

  printf("Sum of all numbers is %d\n", sum);
}

Ctrl+D 结束输入。

执行示例:

1 2 3
4 5
6 7
8
Sum of all numbers is 36

输入8后按Ctrl+D

while (scanf("%d", &amp;number) == 1)的解释

scanf 在输入流结束时返回成功扫描的项目数或EOF。所以在这里我们决定如果scanf返回的不是1(意味着用户要么按下Ctrl+D触发了EOF,或者输入了一些东西)就停止循环这不是一个数字(例如ABC)。

【讨论】:

  • 在 Windows 上,用 Ctrl+Z 结束输入,然后在单独的一行中输入 Enter
  • @thebusybee &lt;kbd&gt;Ctrl&lt;/kbd&gt; 在 cmets 中不起作用。
  • 是的,我注意到了(为时已晚),很遗憾。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-09
相关资源
最近更新 更多