【问题标题】:Why I should subtract '0' so that I can do int_arr[5] = char_string[5]?为什么我应该减去 '0' 以便我可以做 int_arr[5] = char_string[5]?
【发布时间】:2021-12-07 07:13:46
【问题描述】:

所以我被分配用 c 语言存储两个 50 位整数并使用它们做数学方程式。对我来说,问题是将输入的数字逐位存储在数组中。我想我可以将输入存储在这样的字符字符串中:

#include <stdlib.h>
#include <stdio.h>

int main ()
{
    char string_test [50];
    scanf("%s", string_test);
    return 0;
}

但我不能将它用作数字,因为它存储为 char,我无法将它们逐位复制到另一个定义为 int 的数组中

经过一整天的搜索,我发现我需要像这样一个一个地复制我的字符串:

#include <stdlib.h>
#include <stdio.h>

int main ()
{
    char string_test [50];
    scanf("%s", string_test);

    int arr[50];

    for (int i = 0; i < 50; i++)
    {
        arr[i] = string_test[i] - '0';
    }
    return 0;
}

现在我的问题是为什么我需要减去“0”才能得到合适的结果?

【问题讨论】:

  • 旁白:char string_test [50]; 1 太小,无法存储 50 位 字符串。使用char string_test [50+1]; scanf("%50s", string_test); 等。
  • 您可以查看数值 5 和字符 '5' 的 ASCII 表示之间的区别。后者的数值为0x3553,这对于做数学计算是相当无用的
  • 问题的答案和问题的解释可以在普通 C 编程书籍的“字符串”一章中找到。与一整天的搜索相比,学习所花费的时间应该少得多。
  • 数字字符'0''9'保证有连续的字符代码,因此从任何数字字符中减去'0'字符的字符代码将其转换为对应的数字值。

标签: arrays c char integer


【解决方案1】:

数字 0 - 9 的 ASCII 值为:

Digit          0   1   2   3   4   5   6   7   8   9

ASCII value   48  49  50  51  52  53  54  55  56  57  

所以如果你有一个整数的字符串表示,比如说

char int_str[] = "123456";

并且需要将每个char 转换为其数值,从每个值中减去'0' (48) 的值将得到值

int_str[0] == '1' ==>  '1' - '0' ==> 42 - 41 == 1
int_str[1] == '2' ==>  '2' - '0' ==> 43 - 41 == 2
int_str[2] == '3' ==>  '3' - '0' ==> 44 - 41 == 3
int_str[3] == '4' ==>  '4' - '0' ==> 45 - 41 == 4
int_str[4] == '5' ==>  '5' - '0' ==> 46 - 41 == 5
int_str[5] == '6' ==>  '6' - '0' ==> 47 - 41 == 6  

要将数字 1 2 3 4 5 6 转换为整数 123456 需要额外的步骤:

此示例使用封装在函数中的相同转换将离散的char 数字转换为int 数字值,然后将每个离散的 int 数字值同化为复合整数值:

int main(void)
{
    char str[] = "123456";
    int int_num = str2int(str);

    return 0;   
}

 int str2int(char *str)
 {
    int sum=0;

    while(*str != '\0')
    {    //qualify string
         if(*str < '0' || *str > '9')
         {
             printf("Unable to convert it into integer.\n");
             return 0;
         }
         else
         {   //assimilate digits into integer 
             sum = sum*10 + (*str - '0');
             str++;
         }
    }
    return sum;
}

【讨论】:

    【解决方案2】:

    这其实和数字的ASCII码表示有关;当您输入一个字符“0”时,它会作为值 48(十进制)以及任何其他数字或字符存储在内存中。

    您会发现 '1' 的 ASCII 码值为 49,因此,如果我们应用操作 int x = '1' - '0';,我们会将十进制值 1 存储在 x 中并将其作为数字处理,而不是任何字符更多。

    您可以搜索更多关于 ASCII 码的信息;对于任何程序员来说,这都是一个非常有用的话题。

    【讨论】:

      【解决方案3】:

      '0' 这样的字符只是一个 1 字节数字的 ASCII 表示。这些字符的数字表示可以在手册 (man ascii) 中找到。在这里你会看到'0'实际上代表数字480x30,而'0''9'的ASCII码是连续的。

      要将数字 char 值转换为对应的整数,需要减去 48'0' 的值。

      我希望这可以解决问题。有关更多信息,请查看 C 中的 char 算术。

      【讨论】:

        猜你喜欢
        • 2021-07-12
        • 2019-09-26
        • 1970-01-01
        • 2022-11-15
        • 1970-01-01
        • 2010-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多