【问题标题】:scan n numbers without spaces in C在C中扫描n个不带空格的数字
【发布时间】:2024-01-11 11:33:01
【问题描述】:

假设在一行中输入 n 个不带空格的数字,条件是这些数字满足它们位于 1 到 10 之间的条件。

说 n 是 6 ,然后让输入像“239435” 那么如果我有一个存储这些数字的数组,那么我应该得到 ​​p>

    array[0]=2
    array[1]=3
    array[2]=9
    array[3]=4  
    array[4]=3

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

【问题讨论】:

  • 请告诉我们你尝试了什么?
  • 如果您希望数字范围为[0,9],那么您可以使用width specifier of scanf。但是你正在处理[1,10]..
  • @starrify : array[0] = (input/10^n) 这让我相信输入将在[0,9] 范围内。
  • scanf("%1d%1d%1d%1d%1d%1d", a,a+1,a+2,a+3,a+4,a+5)
  • @BLUEPIXY :您能否发布您的方法作为答案?这就是确切的答案。我今天学到了一些新东西,谢谢。

标签: c scanf


【解决方案1】:

只需将0的ASCII码减去每个数字即可得到它的值。

 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++;
 }

【讨论】:

  • 或者更好的可读性和可理解性使用array[i] = s[i] - '0';
  • 这在 C 中不起作用。你不能在 for 语句中声明变量。
  • @Devolus ...scanf() 的用途在哪里?我的意思是说,OP 已经用 scanf 标记了帖子。所以,问。
  • @SouravGhosh 通过scanf读取字符串的结果是......一个字符串又名char *。那么为什么我需要展示显而易见的东西呢?发帖人询问如何将结果字符串转换为数组,而不是如何使用scanf,所以这与答案无关。我们不需要提供完整的工作程序来提供有用的答案,只需提供海报有问题的相关部分即可。至少,这是我对 SO 的看法。因此,既不是“让我为你编写代码”网站,也不是 101 编程课程。
  • @Devolus 先生,请检查 BLUEPIXY 的答案,我想我的版本你会很清楚。我不是说你错了,只是试图专注于更好的方法。
【解决方案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 个之后输入的任何数字都将被静默删除。所以。 . .
  • @SouravGhosh 这只是一个简单的例子。这样的检查当然是个好主意。
【解决方案3】:

您可以使用字符串获取输入,然后检查每个位置并提取它们并存储在数组中。您需要明确检查每个位置的数值,因为您将输入作为字符串接受。对于以字符串形式输入的整数,不能保证输入是纯数字,如果不是,事情可能会变得很疯狂。

检查此代码

#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;
}

【讨论】: