读取可变数量的空格尽可能快地通过标准输入分隔整数

时间:2015-01-13 10:37:03

标签: c

我试图以有效的方式通过控制台使用C读取以下输入(单行中的整数的可变数字,这些整数由空格分隔)。

输入:

4
3 1 2
6 1 1 1 4
17 2 3 2
12

输入行的数量(此处为4,在第一行中给出)是已知的,但一行中的整数数量是未知的。 我发现的一个类似的问题是given here,解决方案对我不起作用(我想我已经理解了这个错误)。

while (i < ARRAY_SIZE && scanf("%d", &a[i++] == 1);

我使用这个解决方案写了一个简单的程序:

#include<stdio.h>
int main()
{
int i=0,ARRAY_SIZE=3,a[ARRAY_SIZE];
while (i < ARRAY_SIZE && (scanf("%d", &a[i++]) == 1));
printf ("%d %d %d %d\n",a[0], a[1], a[2], a[3],i);
}

对于上述程序,2个输入和相应的输出如下:

输入-1:

2 3\n
4 5\n  

输出-1:

2 3 4 0 3

输入-2:

1 4 6 7 4 3 3\n 

输出-2:

1 4 6 0 3

但这不是我对此计划的期望。在这里,我试图只读取一行整数,将它们存储在一个数组中,并在一行结束后立即终止,这样如果我想读取多行,我可以选择使用循环来处理那些行(4在原始输入中。)

我可能无法理解上述解决方案,并试图在不适当的地方使用它。所以大家请帮助我以有效的方式从控制台中获取空格分隔的整数输入。

2 个答案:

答案 0 :(得分:1)

使用

fgets()读取到行尾并使用strtol()atoi()

获取整数

检查代码:

#include <stdio.h>

int main(void) {
    char a[100];
    int b[100];
    int i=0,j;

while(fgets(a, sizeof(a), stdin) != NULL)
{
   char *p = strtok(a, " ");
   while( p != NULL)
   {
     int d = atoi(p); /* Assuming you are entering valid integers else use `strtol()` */
     b[i++] = d;
     p = strtok(NULL, " ");
   }
}

for (j=0;j<i;j++)
printf("%d ",b[j]);
}

答案 1 :(得分:0)

适合文件的原始描述和任何长度的行,但是无用。

int n,a,s=-1;
fscanf("%d\n",&n);

while(n)
{
  a=getchar();
  if(a==EOF) return 1;
  if(isnumeric(a))
  {  
     if(s==1)
         putchar(' ');
     putchar(a); 
     s=0;
     continue;
  }
  if(!s)
     s=1;
  if(a=='\n') n--;
}