为什么我应该减去'0'以便我可以做到int_arr[5] = char_string[5]?
Why I should subtract '0' so that I can do int_arr[5] = char_string[5]?
所以我被分配用 c 语言存储两个 50 位整数并使用它们进行数学方程式。我的问题是将输入的数字逐位存储在数组中。我想我可以将输入存储在这样的 char 字符串中:
#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'才能得到合适的结果?
像 '0'
这样的字符只是一个 1 字节数字的 ASCII 表示。这些字符的数字表示可以在手册中找到 (man ascii
)。在这里你会看到 '0'
实际上代表数字 48
或 0x30
并且 ASCII '0'
到 '9'
是连续的。
要将数字 char 值转换为其对应的整数,需要减去 48
或 '0'
的值。
我希望这能解决问题。有关更多信息,请查看 C 中的 char 算法。
这其实和数字的ASCII码表示有关;当您输入一个字符“0”时,它会作为值 48(十进制)以及任何其他数字或字符存储在内存中。
您会发现“1”的 ASCII 码值为 49,因此,如果我们应用运算 int x = '1' - '0';
,我们会将十进制值 1 存储在 x 中并将其作为数字处理,不再是角色了。
更多ASCII码可以搜索;这对任何程序员来说都是一个非常有用的话题。
数字 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 != '[=13=]')
{ //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;
}
所以我被分配用 c 语言存储两个 50 位整数并使用它们进行数学方程式。我的问题是将输入的数字逐位存储在数组中。我想我可以将输入存储在这样的 char 字符串中:
#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'才能得到合适的结果?
像 '0'
这样的字符只是一个 1 字节数字的 ASCII 表示。这些字符的数字表示可以在手册中找到 (man ascii
)。在这里你会看到 '0'
实际上代表数字 48
或 0x30
并且 ASCII '0'
到 '9'
是连续的。
要将数字 char 值转换为其对应的整数,需要减去 48
或 '0'
的值。
我希望这能解决问题。有关更多信息,请查看 C 中的 char 算法。
这其实和数字的ASCII码表示有关;当您输入一个字符“0”时,它会作为值 48(十进制)以及任何其他数字或字符存储在内存中。
您会发现“1”的 ASCII 码值为 49,因此,如果我们应用运算 int x = '1' - '0';
,我们会将十进制值 1 存储在 x 中并将其作为数字处理,不再是角色了。
更多ASCII码可以搜索;这对任何程序员来说都是一个非常有用的话题。
数字 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 != '[=13=]')
{ //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;
}