从单个输入行(scanf?)读取多个数字的C语言方法

9

我已经用 C 写了一个应用程序,它需要两行输入。第一行输入告诉数组的大小(整数),第二行输入包含由空格分隔的值。例如,以下是输入示例:

5
1 2 3 4 99

应该创建一个包含{1,2,3,4,99}的数组。

最快的方法是什么?我的问题是读取多个数字而不必循环整个字符串来检查它是空格还是数字?

谢谢。

5个回答

22
int i, size;
int *v;
scanf("%d", &size);
v = malloc(size * sizeof(int));
for(i=0; i < size; i++)
    scanf("%d", &v[i]);

在完成后记得使用free(v)

另外,如果由于某种原因您已经有了数字的字符串表示形式,可以使用sscanf()


2
%d(以及大多数%转换,但不是所有)会自动跳过任何空格。请阅读scanf文档以获取详细信息! - Denilson Sá Maia
2
如果由于某种原因,您不应该使用 scanf,而应该优先使用 fgetssscanf。http://c-faq.com/stdio/scanfprobs.html - jamesdlin
1
它可能会在输入缓冲区中留下未处理的输入,这一事实应该让你感到不安。是的,你可以安全地使用 scanf 的方法,但你必须跳过的所有障碍根本不值得。对于初学者来说,使用 fgetssscanf 更简单,也更少出现意外情况。 - jamesdlin
我同意。如果输入是字符串类型的,那么fgets是最好的选择。 - Pankaj Dwivedi
scanf("%d"...在OP的标题中并没有强制要求输入一行。如果用户输入的格式不符合预期,这种方法在许多方面都会失败,因为它缺乏错误检测。对于初学者来说还可以,但对于良好的编程来说是不够的。 - chux - Reinstate Monica
显示剩余2条评论

4

这里的'N'是数组'A'的元素数量。

int N, A[N];
printf("Input no of element in array A: ");
scanf("%d", &N);
printf( "You entered: %d\n", N);
printf("Input array A elements in one line: ");
for(int i=0; i<N; i++){
   fscanf(stdin, "%d", &A[i]);
   printf( "A[%d] is: %d\n", i, A[i]);
}

3
你可以通过解释如何回答OP的问题来改进你的答案。 - MicroVirus

1
这是一个从http://www.cplusplus.com/reference/cstring/strtok/中提取并适应到我们环境的示例。
它将str链分成子链,然后我将每个部分转换为int。我期望输入行是由逗号分隔的数字,没有其他字符。Size是您数组的大小。您应该像Denilson在他的回答中所述那样执行scanf("%d",&size)操作。最后,您将得到包含所有值的int数组。
int main(){
  int size = 5, i = 0;
  char str[] ="10,20,43,1,576";
  int list[size];
  char * pch;
  printf ("Splitting string \"%s\" into tokens:\n",str);
  pch = strtok (str,",");
  list[i] = atoi(pch);
  i++;
  while (pch != NULL)
  {
    pch = strtok (NULL, ",");
    if(pch != NULL)
      list[i] = atoi(pch);
    i++;
  }

  for(i=0;i<size;i++){
    printf("%d. %d\n",i+1,list[i]);
  }
  return 0;
}

0

scanf()有点麻烦。针对这种问题,可以尝试使用strtol(),它会让你的生活变得非常轻松。


1
和strtok一起使用可能很有趣,但我不知道怎么一开始读取整行。;/ - migajek
@michal,fgets()会读取一行。我不知道为什么你需要strtok()来解决你的问题。 - Carl Norum
strtol仅返回第一个数字。这并不是我们的目的,对吧? - Sandeep
它每次只给出一个数字,但是这可以通过循环轻松解决。 - Carl Norum

-2

这段代码采用了一个简单的方法,通过getchar()读取每个字符。我们继续读取数字,直到找到空格为止。然后更新数组的索引'i'。这个过程重复进行,直到遇到换行符('\n')。

#include<iostream>
main()
{
  char ch;
  int arr[30] ;
  ch =getchar();
  int num = 0;
  int i=0;
  while(ch !='\n')
  {
    if(ch == ' ')
    { 
      arr[i] = num;
      i++;
      num = 0;
    }
    if(((ch -48) >=0) && (ch-48 <=9))
      num = (num*10) + (ch - 48);
    ch = getchar();   
  }
  arr[i] = num;
  for(int j=0;i<=i;j++)
     std::cout<<arr[i]<<" ";
 }

1
虽然这段代码可能回答了问题,但提供有关它如何以及/或为什么解决问题的附加上下文将改善答案的长期价值。请阅读此链接:https://stackoverflow.com/help/how-to-answer - S.R
1
当数字为负数或以“+”开头时,此方法会失败。这不是C代码。 - chux - Reinstate Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接