使用scanf读取空格分隔的数字并将它们存储在数组中 - C

时间:2014-10-09 16:21:39

标签: c

我正在尝试使用scanf()获取包含一堆空格分隔的1-3位数字的用户输入,并将它们存储到一个int数组中,并在新行上打印每个单独的数字以进行测试,但它无法正常工作。以下是我到目前为止的情况:

#include <stdio.h>
#include <string.h>

int main()
{
  int sourceArr[500];
  int i = 0;

  printf("\nEnter ciphertext: \n");
  while (scanf("%d", &sourceArr[i++]) == 1);
  for (int j=0;j<500;j++) {
    printf("%d\n", sourceArr[j]);
  }
}

因此要求用户输入一系列数字,如下所示:

Enter ciphertext: 
23 122 32

我想在sourceArr [0]中存储23,在sourceArr [1]中存储122,在sourceArr [2]中存储32,然后像这样打印每个:

23
122
32

但程序在输入输入后立即闲置,不会打印数字。

3 个答案:

答案 0 :(得分:1)

成功时, scanf 会返回成功填充的参数列表的项目数。由于匹配失败,读取错误或文件结束的范围,此计数可以匹配预期的项目数或更少(甚至为零)。

您可以将其更改为:

#include <stdio.h>
#include <string.h>

int main()
{
  int sourceArr[500];
  int i = 0;

  printf("\nEnter ciphertext: \n");
  while (scanf("%d", &sourceArr[i++]) == 1);
  for (int j=0;j<i-1;j++) {
    printf("%d\n", sourceArr[j]);
  }
}

然后,如果您输入: 1 2 3 4 5 6 x(并按回车)

它会根据您的需要显示。

如果你不喜欢&#39; x&#39;你可以在行中使用它:

while (scanf("%d", &sourceArr[i++]) != EOF);

然后输入类似的内容: 12 23 345 554(点击回车)然后在窗口中按住(ctrl + z)或在unix中按住(ctrl + d)。

请参阅此主题:End of File(EOF) of Standard input stream (stdin)

ctrl + z显式使scanf返回EOF,因为控制台没有EOF,需要以这种方式发送。

答案 1 :(得分:1)

"%d"消耗领先的空白区域,例如' ''\n',而不只是' '

因此,当用户输入&#34; 123 456 789&#34; 输入,再次调用scanf()等待更多输入。它将继续等待,直到输入的非数字数据stdin关闭或很少出现IO错误。

由于stdin通常是缓冲的,stdinscanf() Enter 之前看不到来自某行的任何输入按压。

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

如果代码需要使用 Enter 结束输入,请使用fgets()读取。然后使用sscanf()strtol()对其进行解析。以下内容使用"%n"来记录char扫描的数量。

char buf[100];
printf("\nEnter ciphertext: \n");
if (fgets(buf, sizeof buf, stdin) == NULL)
  Handle_EOF();

char *p = buf;
int n;
while (sscanf(p, "%d%n", &sourceArr[i], &n) == 1) {
  i++;
  p += n;
}

for (int j = 0; j < i; j++) {
  printf("%d\n", sourceArr[j]);
}

答案 2 :(得分:0)

scanf返回成功扫描的项目数。尝试以下代码:

    #include <stdio.h>

    int main()
    {
      int sourceArr[500];
      int i = 0;
      int sc =0; //scanned items
      int n=3; // no of integers to be scanned

      printf("\nEnter ciphertext: \n");
       while(sc<n){
          sc += scanf("%d",&sourceArr[i++]);
       }
      for (int j=0;j<i;j++) {
        printf("%d\n", sourceArr[j]);
      }
    }