【问题标题】:C: Reading pairs of ints from user until newline (scanf, sscanf, fgets and friends)C:从用户读取整数对直到换行(scanf、sscanf、fgets 和朋友)
【发布时间】:2015-01-18 12:46:31
【问题描述】:

我正在尝试从标准输入读取未知对,直到输入新行。

输入示例:

输入一些东西:

5

输入对:

1 3 4 2 5 2 5 4

这样做的最佳方法是什么?我尝试了几种方法,包括 fgets 和 sscanf - 但无法获得预期的结果。

这是我尝试过的,但我一直错过\n:

方法#1:

while (1)
{
    scanf("%d %d", &a, &b);

    // do something with a,b

    if (getchar() == '\n')
        break;
}

方法#2:

while (scanf("%d %d", &a, &b) == 2)
{
    // do something with a,b

    if (getchar() == '\n')
        break;
}

我一直陷入无限循环 - 我做错了什么?

【问题讨论】:

标签: c input fgets scanf


【解决方案1】:

我相信处理行尾空格的最简单方法(这可能是导致您的问题的原因)是提前阅读该行并使用sscanf 解析它。大概是这样的:

#include <stdio.h>

int main() {
  char line[1024];
  char const *p;
  int x, y;
  int n;

  fgets(line, 1024, stdin);

  for(p = line; sscanf(p, " %d %d%n", &x, &y, &n) == 2; p += n) {
    printf("%d %d %d\n", x, y, n); // to show you what happens
  }

  return 0;
}

这里的%n 使sscanf 告诉您到目前为止已处理的字符数,我们使用该数字在每次迭代中推进我们的读取指针。

这通过忽略最后一个数字来处理一行中的奇数个数字,这可能是也可能不是您想要发生的。

【讨论】:

  • 我非常喜欢你的回答……但只是一个建议fgets(line, sizeof(line), stdin);,格式字符串中不需要空格。
  • 看起来是提供的最佳解决方案 - 在通过 sscanf 时错过了 '%n' 部分。谢谢!
【解决方案2】:

你会得到一个无限循环,因为读取的最后一个数字之后的下一个字符不是换行符而是空格

所以如果你输入这个输入

1 3 4 2 5 2 5 4 

这是

1<space>3<space>4<space>2<space>5<space>2<space>5<space>4<Enter>

你可以让它工作(请注意输入中最后一个数字 4 之后的最后一个字符)

我们来分析上面的例子

1<space>3<space>
|       |  |-----> will be stored in getchar()
|       |--------> will be stored in b 
|----------------> will be stored in a 

所以对于最后两位数字,如果您点击空格而不是输入按钮,就会发生这种情况

5<space>4<space>
|       |  |-----> will be stored in getchar() which is not newline 
|       |          so it will generate another loop 
|       |--------> will be stored in b 
|----------------> will be stored in a 

所以程序将等待输入数字,因为另一个循环被创建并卡在那里,因为没有数字了!!

要解决这个问题,您可以使用 fgets() 函数将整行存储在一个字符串中,然后使用 sscanf() 函数从中获取一对数字

【讨论】:

  • 试试1234 5678
  • 你是对的!我只想到数字! @iharob 不错!
猜你喜欢
  • 1970-01-01
  • 2016-08-14
  • 2023-01-21
  • 2015-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多