在C语言中扫描n个没有空格的数字

3
假设有 n 个数字需要在单行输入,且这些数字必须在 1 和 10 之间。例如,当 n 为 6 时,输入可以为 "239435"。如果我要将这些数字存储在数组中,那么我应该得到以下结果:
    array[0]=2
    array[1]=3
    array[2]=9
    array[3]=4  
    array[4]=3

我可以通过使用 array[0]=(input/10^n) 来获得上述结果,然后是下一位数字,但是是否有更简单的方法呢?


请展示一下你尝试过什么? - Peter Miehle
2
如果您想要范围在[0,9]之间的数字,则可以使用scanf宽度说明符。但是,您正在处理[1,10] - starrify
@starrify: array[0] = (input/10^n) 这让我相信输入将在范围 [0,9] 内。 - 0xF1
3
scanf("%1d%1d%1d%1d%1d%1d", a,a+1,a+2,a+3,a+4,a+5) - BLUEPIXY
@BLUEPIXY: 你能发表你的方法作为答案吗?那就是确切的答案。我今天学到了新东西,谢谢。 - 0xF1
3个回答

2
你可以使用一个字符串来获取输入,然后检查每个位置并将它们提取出来存储到数组中。由于你将输入作为字符串接受,所以需要显式地在每个位置上检查数值。对于以字符串形式输入的整数,不能保证输入是纯数字,如果不是,就可能会出现问题。
请看以下代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
        char ipstring[64];
        int arr[64];
        int count, len = 0;
        printf("Enter the numbersi[not more than 64 numbers]\n");
        scanf("%s", ipstring);
        len = strlen(ipstring);
        for (count = 0; count < len ; count++)
        {
                if (('0'<= ipstring[count]) && (ipstring[count] <= '9'))
                {
                        arr[count] = ipstring[count] - '0';

                }
                else
                {
                        printf("Invalid input detectde in position %d of %s\n", count+1, ipstring );
                        exit(-1);
                }
        }
        //display
        for (count = 0; count < len ; count++)
        {
                printf("arr[%d] = %d\n", count, arr[count]);
        }
        return 0;
}

2

只需减去每个数字的ASCII码中的0,即可得到其值。

 char *s =  "239435"
 int l = strlen(s);
 int *array = malloc(sizeof(int)*l);
 int i;
 for(i = 0; i < l; i++)
      array[i] = s[i]-'0';

更新

假设0不是有效输入,只允许输入1-10之间的数字:

 char *s =  "239435"
 int l = strlen(s);
 int *array = malloc(sizeof(int)*l);
 int i = 0;
 while(*s != 0)
 {
      if(!isdigit(*s))
      {
           // error, the user entered something else
      }

      int v = array[i] = *s -'0';

      // If the digit is '0' it should have been '10' and the previous number 
      // has to be adjusted, as it would be '1'. The '0' characater is skipped.
      if(v == 0)
      {
           if(i == 0)
           {
               // Error, first digit was '0'
           }


           // Check if an input was something like '23407'
           if(array[i-1] != 1)
           {
               // Error, invalid number
           }
           array[i-1] = 10;
      }
      else
          array[i] = v;

     s++;
 }

1
或者更易读懂的方式是使用 array[i] = s[i] - '0'; - 0xF1
这在C语言中不起作用。你不能在for语句内声明变量。 - codewarrior
@Devolus ... scanf() 函数在哪里使用了?我的意思是,楼主已经标记了这篇帖子为 scanf 相关问题,所以我想问一下。 - Sourav Ghosh
@SouravGhosh 通过 scanf 读取字符串的结果是一个字符串,也就是 char *。那么我为什么需要说明这个显而易见的事实呢?提问者询问的是如何将得到的字符串转换为数组,而不是如何使用 scanf,因此这与答案无关。我们不需要提供完整的工作程序来使答案有用,只需要提供与提问者遇到问题相关的部分即可。至少在我的看法中,SO 不是一个“让我为你编码”的网站,也不是一个 101 编程课程。 - Devolus
在将上一个数字设置为“10”之前,您还可以检查它是否确实为“1”,并引发错误(或者在您的情况下)。这将处理类似于“23407”的输入。 - Devolus
显示剩余5条评论

2
例如。
int a[6];
printf(">");
scanf("%1d%1d%1d%1d%1d%1d", a,a+1,a+2,a+3,a+4,a+5);
printf("%d,%d,%d,%d,%d,%d\n", a[0],a[1],a[2],a[3],a[4],a[5]);

结果:

>239435
2,3,9,4,3,5

谢谢您提供的信息,先生。非常有帮助。一个小问题:是否最好给出一些有关scanf()计数的提示呢?依我之见,对于这段代码,输入第6个数字后的任何数字都会被静默丢弃... - Sourav Ghosh
@SouravGhosh 这只是一个简单的例子。当然进行这样的检查是个好主意。 - BLUEPIXY

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接