如何在C语言中读取以空格分隔的n个数字

如何在C语言中读取以空格分隔的n个数字,c,arrays,input,scanf,C,Arrays,Input,Scanf,我想在执行过程中从用户那里读取n整数,数字之间用空格分隔。最好将其作为阵列接收。对于输入12234453,结果是,array[0]=1,array[1]=22,依此类推。我必须用C写,不能用 scanf("%d %d %d", &var1, &var2, &var3); 因为,我不知道会插入多少这样的数字。在读取此数据之前,将从用户处读取n的值。使用,然后使用 将数字作为字符串 这里有一种方法 #include <stdio.h> #include <

我想在执行过程中从用户那里读取
n
整数,数字之间用空格分隔。最好将其作为阵列接收。对于输入
12234453
,结果是,
array[0]=1
array[1]=22
,依此类推。我必须用C写,不能用

scanf("%d %d %d", &var1, &var2, &var3);
因为,我不知道会插入多少这样的数字。在读取此数据之前,将从用户处读取
n
的值。

使用,然后使用

将数字作为字符串

这里有一种方法

#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);
}
#包括
#包括
#包括
int main()
{
字符数[100];
int myn[100];
printf(“给我数字…\n”);
FGET(数字,100,标准输入);
常量字符s[2]=“”;
字符*令牌;
令牌=strtok(数字,s);
int i=0;
myn[i]=atoi(令牌);
while(令牌!=NULL)
{
i++;
printf(“%s\n”,标记);
令牌=strtok(空,s);
myn[i]=atoi(令牌);
}
printf(“你给了我:”);
对于(int j=0;j
enum{MAX_NUMBERS=1000000};//选择适当的上限
int n;
如果(scanf(“%d”,&n)==1&&n>0&&n
您可以使用
scanf()
读取多个数字,如图所示,使用循环。您不知道这些数字是否全部显示在一行中,或者每个数字都在自己的行中,或者连续数字之间是否有许多空行(或者所有这些可能性的任何排列)

scanf()
函数系列基本上不关心换行符-很难强制它们这样做。当您关心基于行的输入时,使用或POSIX函数读取行,或使用其他字符串解析函数处理行


我假设支持带有VLA(可变长度阵列)的C99。没有这种支持,原理是一样的-机制有点不同(并且有多种选项可供选择).

你听说过循环吗?我不认为循环可以用来读取同一行上用空格分隔的数字。循环运行时每个值需要不同的语句,对吗?如果我错了,请更正。如果你不知道循环中可以使用多少元素,可以使用固定长度的a类数组
int arr[MAX_ELEMS]
存储这些值,或
realloc
,或链接列表…有几种方法。@NirmalScaria您可以,但我们需要使用类似
atoi
strtol
的方法将这些字符串转换为
int
,不是吗?是的;在使用
strtok
将字符串拆分为单个值后,您将使用such一个将单个值字符串转换为
int
s的函数。不需要使用
strtok()
;使用
strtol()
更好。它告诉您每个转换的数字的结尾在哪里;它还进行范围检查等。
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…
}