【问题标题】:Storing each individual digit from an integer in array将整数中的每个单独的数字存储在数组中
【发布时间】:2021-12-09 22:32:25
【问题描述】:

早安,

我对 c 很陌生,并试图找到一种方法将用户整数输入作为单个数字存储到数组中。

例如,

用户输入:2736

我希望它存储在数组中

digits[0] = {2} 
digits[1] = {7} 
digits[2] = {3} 
digits[3] = {6}

我搜索了许多在线讨论,但许多解决方案是使用 for 循环,如果用户尝试输入一个大数字(例如 209377383838),则对用户不友好。

有没有人有解决方案来存储输入,将其分解并将单个数字存储到数组中?感谢您的帮助!

【问题讨论】:

  • 到目前为止你尝试了什么?你需要展示你的努力。
  • 请注意英文单词“number”和“digit”不是一回事。数字是从'0''9' 的单个字符,而数字可以由一个或多个数字组成。使用不正确的措辞会使读者感到困惑。我已在适当的地方使用“数字”一词编辑了您的答案。
  • 考虑您的整数,可能是由人从键盘输入的,或通过服务传输的,等等,它可能已经是一个字符串 ...这意味着您不需要将其从整数转换为字符串。实际上,您可能需要稍后将其解析为整数,其中包含所有问题。
  • 您希望数组元素包含数字作为字符代码,即'0',还是作为整数数据类型?例如,您希望第一个数组元素包含实际整数2,还是包含'2' 的字符代码,在ASCII 中是字符代码50

标签: arrays c scanf


【解决方案1】:

您可以将来自用户的数字存储为字符串,然后将其从 ASCII 格式转换为十进制并将其存储在您的数组中:

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

int main(){
    char input[1001];
    int arr[1000];
    int i;

    // Take the number as string
    printf("Enter the number: ");
    scanf("%s", input);

    // Convert ASCII to decimal
    for (i = 0; i < strlen(input); i++)
    {
        arr[i] = input[i] - '0';
    }

    return 0;
}

【讨论】:

  • 输入不是整数。
  • 是的,这就是重点。因此用户输入例如 12345,程序会将其存储为字符串“12345”。然后将每个 ASCII 字符(例如 '1')转换为十进制。如果您不希望用户逐位输入数字,这是实现这一目标的最简单方法。
  • 没有关于用户输入的内容。字符串不是数字。
  • 我建议您重新阅读用户问题并在最后使用简单的printf 为数组arr 测试上面的代码
  • 谢谢!这就是我要找的!现在我只需要为用户添加验证以输入 int 的特定长度。再次感谢!
【解决方案2】:

您可以使用sprintf 函数将整数放入字符串。

注意1:由于输入是long int,所以不能超过2,147,483,647。

注意2:使用unsigned long long int 可能会很有趣,它至少包含[0, +18,446,744,073,709,551,615] 范围。它是指定的,因为标准的C99 版本。

int main()
{
long int num; 
scanf("%li",&num);

// Convert number to a string
char snum[20];
sprintf(snum,"%ld", num);

printf("Number as string: %s\n", snum);

return 0;
}

[更新]

如果输入可以是字符串类型,那么可以使用gets函数。

#include <stdio.h>
int main()
{
char snum[20];  
gets(snum);
    // this loop is just to show the result.
    for (int i=0;i<strlen(snum);i++){
        printf("digits[%2d] = {%c} \n", i,snum[i]);
    }

return 0;
}

[输入] 示例:209377383838

[输出]

digits[ 0] = {2} 
digits[ 1] = {0} 
digits[ 2] = {9} 
digits[ 3] = {3} 
digits[ 4] = {7} 
digits[ 5] = {7} 
digits[ 6] = {3} 
digits[ 7] = {8} 
digits[ 8] = {3} 
digits[ 9] = {8} 
digits[10] = {3} 
digits[11] = {8} 

【讨论】:

  • 这个答案没有解决 OP 对用户输入非常高的数字的担忧。 long int 只能保证至少能够表示 2,147,483,647。如果用户输入问题中提到的数字,则此答案中的代码在long int 仅具有 ISO C 标准要求的最小宽度的平台上具有未定义的行为。
  • 谢谢@AndreasWenzel,我已根据您的有用说明更新了我的答案。
  • 请注意,您可能还需要考虑使用long long int(或简称为long long),它保证至少为64 位宽。与long 相比,long long 保证能够代表问题中提到的数字。
  • 函数 gets 不再是 ISO C 标准的一部分。但是,您仍然可以使用fgets(我不建议使用gets_s 作为替代,因为它只是可选支持)。删除gets 的原因见此问题:Why is the gets function so dangerous that it should not be used?
  • @AndreasWenzel,添加了关于 'long long int' 类型的 Note2。真的很感兴趣。
猜你喜欢
  • 2012-10-02
  • 2021-09-28
  • 1970-01-01
  • 2018-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-28
  • 1970-01-01
相关资源
最近更新 更多