【问题标题】:How to read n numbers separated by space in C [closed]如何在C中读取以空格分隔的n个数字[关闭]
【发布时间】:2017-02-07 18:22:03
【问题描述】:

我想在执行期间从用户那里读取n 整数,并且数字用空格分隔。最好作为数组接收。对于输入1 22 3 445 3,结果为array[0]=1array[1]=22等等。我必须用 C 来做。不能使用

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

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

【问题讨论】:

  • 你听说过循环吗?
  • 我不认为循环可以用来在同一行读取以空格分隔的数字。每个值都需要不同的语句才能运行循环,对吗?如果我错了,请纠正。
  • 如果您不知道可以在循环中使用多少个元素 fgetsstrtol,您可以使用固定长度的数组,例如 int arr[MAX_ELEMS]; 来存储这些值,或者 @987654330 @,或链表...有几种方法。
  • @NirmalScaria 你可以

标签: c arrays input scanf


【解决方案1】:
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。没有这种支持,原则是相同的——机制略有不同(并且有多种选择)。

【讨论】:

    【解决方案2】:

    使用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 循环中,它将您从键盘输入的数字打印到屏幕上。通过在数字之间使用 enter 而不是 spaces,“问题”会容易得多。


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

    【讨论】:

    • 但是我们需要使用atoistrtol 之类的方式将这些字符串转换为int,不是吗?
    • 是的;在使用strtok 将字符串拆分为单独的值后,您将使用这样的函数将单独的值字符串转换为ints。
    • 不用strtok();使用strtol() 会更好。它告诉您每个转换后的数字的结尾在哪里;它还进行范围检查等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 2012-10-17
    • 2012-07-03
    • 2022-01-20
    • 1970-01-01
    相关资源
    最近更新 更多