【问题标题】:Reading space separated numbers from stdin into a linked list将空格分隔的数字从标准输入读入链表
【发布时间】:2016-01-15 06:34:57
【问题描述】:

我正在尝试将用空格分隔的数字从标准输入读取到 c 程序中,并在每个数字上添加一个节点到链表。

来自标准输入的输入:

20
20 30 123 34 50

stdin (20) 的第一行用于查找编号为 20 的项目。 第二行包含要插入到链表中的数据项 进入后它应该结束循环,但它不是,我不确定我在这里错过了什么。

  char follow;
  scanf("%d", &M);
  while(((count = scanf("%d%c", &element, &follow)) > 0))
    {
      if(count == 2 && isspace(follow) || count == 1)
        {
          printf("count = %d and element = %d\n", count, element);
          push(&root, element);
        }
      else{
        break;
      }
    }

问题是 while 循环不会在按 Enter 时结束。

【问题讨论】:

  • 如果使用"%d"格式,则不需要读取空格,它将跳过前导空格。
  • @JoachimPileborg - 我试过这样做但没有运气 while(((count = scanf("%d", &element)) > 0)) { printf("count = %d and element = % d\n", 计数, 元素);推(&根,元素); }
  • 现在的问题是,在你显示的那个之后会有other输入吗?有任何输入吗?然后,您可能必须使用例如将该行作为一行读取。 fgets,在空间上拆分输入(例如strtok)并将数字显式转换为整数(例如strtol)。如果这是用户将给程序的唯一输入,那么您根本不需要空格处理,但您需要用户按“eof”键(Windows 上为CTRL-ZCTRL-D 上POSIX 系统(如 Linux 或 OSX)来终止输入。或者也使用上面描述的行处理。
  • 这是因为换行符是white space 字符。因此isspace('\n') 将返回 true。
  • @JoachimPileborg 似乎输入键是哨兵。

标签: c scanf stdin


【解决方案1】:

你可以改变你的 if 条件:

if ((count == 2 && isspace(follow) && follow != '\n') || count == 1)

因为' ' 和换行符'\n' 都是空格,所以isspace 本身是不够的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-17
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-11
    • 1970-01-01
    相关资源
    最近更新 更多