【问题标题】:Scan multiple integers without knowing the actual number of integers在不知道实际整数个数的情况下扫描多个整数
【发布时间】:2014-11-26 11:00:42
【问题描述】:

我必须输入我不知道频率的值...

例如第一个输入:1 32 54 65 6

第二个输入:2 4 5

我首先想到的是,扫描值,如果换行 '\n' 则中断循环,但这并没有那么顺利,所以我说我使用字符,然后我进行类型转换以获取数字但是这样做的问题还在于它逐个扫描一个字符,如果它是负值,它也是一个问题;

类似的东西

#include <stdio.h>

int main(){
int myarray[20];
int i=0, data;

while(1){
      scanf("%d", &data);
      if (data == '\n') break; 
      myarray[i]=data;
}

return 0;
}

但是,scanf 会跳过所有特殊字符并仅查找整数...有没有办法将整数扫描到数组中,当有换行符时它会停止?

【问题讨论】:

  • data 到底是在哪里定义的?
  • 您可以阅读整行,将其拆分为例如空格,然后将每个部分转换为整数。
  • 使用fgets()读取该行,然后使用sscanf()
  • 为了可读性,我强烈建议将break; 放入一个新行。虽然这可能是一个品味问题。

标签: c scanf


【解决方案1】:

我的建议是fgets()

  1. 从输入中读取整个line
  2. 使用空格 [] [或您的首选分隔符] [使用 <a href="/default/index/tourl?u=aHR0cDovL2xpbnV4LmRpZS5uZXQvbWFuLzMvc3RydG9r" rel="nofollow" target="_blank">strtok()] 进行标记
  3. 分配内存来存储整数
  4. 将字符串输入转换为整数 [可能是strtol()] 并存储每个整数。

或者,您可能想要添加一些验证和错误检查。

阅读更多关于fgets()here的信息。

另外,不要忘记删除 fgets() 存储在读取缓冲区中的尾随 \n

【讨论】:

  • 我看到 fgets 得到一个字符串,如果我使用说 strtol 或 atoi 将数据更改为字符串,我不太确定它是否会识别负值??
  • @user3564573 如果您注意到,返回类型是long int 对应于strtol(),我认为没有理由不处理负数。至于分隔符,不能使用- 符号作为分隔符。
  • @user3564573 如果您不熟悉,请阅读strtol() 的手册页。提示:它可以很好地处理负值。
  • 谢谢,让我试试
  • 请注意,strtok_r 不是 C 中的标准函数,而是许多编译器中的通用扩展。
【解决方案2】:

按照Sourav Ghosh的建议,推荐使用fgets()

否则代码可以在阅读每个int之前搜索'\n'

#include <ctype.h>
#include <stdio.h>
#define N (20)

int main(void) {

  int myarray[N];
  int i = 0;

  while (1) {
    int ch;
    while (isspace(ch = fgetc(stdin)) && ch != '\n')
      ;
    if (ch == '\n' || ch == EOF)
      break;
    ungetc(ch, stdin);

    int data;
    if (scanf("%d", &data) != 1)
      break; // Bad data
    if (i < N)
      myarray[i++] = data;
  }

  return 0;
}

【讨论】:

    猜你喜欢
    • 2015-04-16
    • 2019-12-16
    • 1970-01-01
    • 2018-08-02
    • 2016-05-09
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多