如何读取C中用空格分隔的n个数字

时间:2017-02-07 18:22:04

标签: c arrays input scanf

我想在执行期间从用户读取n个整数,并且数字用空格分隔。最好是作为阵列接收。对于输入1 22 3 445 3,结果为array[0]=1array[1]=22,依此类推。我必须在C中完成。不能使用

scanf("%d %d %d", &var1, &var2, &var3);

因为,我不知道会插入多少这样的数字。在读取此数据之前,将从用户读取n的值。

2 个答案:

答案 0 :(得分:2)

enum { MAX_NUMBERS = 1000000 };  // Choose appropriate upper bound
int n;
if (scanf("%d", &n) == 1 && n > 0 && n < MAX_NUMBERS)
{
    int array[n];
    for (int i = 0; i < n; i++)
    {
        if (scanf("%d", &array[i]) != 1)
            …process error — terminate loop?…
    }
    …use array…
}

如图所示,您可以使用循环使用scanf()读取多个数字。你不知道它们是全部出现在一条线上,还是每条线都是自己的线,或者连续数字之间是否有很多空白线(或所有这些可能性的任何排列)。

scanf()系列函数基本上不关心换行符 - 很难强迫它们这样做。如果您关心基于行的输入,请使用fgets()或POSIX函数getline()来读取一行和sscanf() - 或其他字符串解析函数 - 来处理该行。

我假设支持带有VLA(可变长度数组)的C99。没有这种支持的原则是相同的 - 机制有点不同(并且有多种选择可以做到这一点)。

答案 1 :(得分:1)

使用fgets(),然后strtok()使用atoi()

将数字作为字符串。

这是一种方法。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
  char numbers[100];
  int myn[100];
  printf("Give me numbers..\n");
  fgets(numbers,100,stdin);
  const char s[2] = " ";
  char *token;

  token = strtok(numbers, s);
  int i=0;    
  myn[i]=atoi(token);

  while( token != NULL ) 
  {
    i++;
    printf( " %s\n", token );
    token = strtok(NULL, s);
    myn[i]=atoi(token);
  }
  printf("You gave me: ");
  for (int j=0; j<i; j++){
    printf ("%d, ", myn[j]);
  }
  return(0);
}

上述C程序完全符合您的要求。在for循环中,它会在屏幕上显示您从键盘输入的数字。 &#34;问题&#34;在数字之间使用输入而不是空格会更容易。

givenumbers.c

单击链接,查看有关所用功能的非常有用的详细信息。