从 char 到 int 的转换并打印十进制值
Conversion from char to int and printing the decimal value
char str[20];
printf("Enter anything\n");
scanf("%s",str);
for(int i = 0 ; i<strlen(str) ; i++)
{
if( isdigit(str[i]))
printf("%d",(int)str[i]);
}
我尝试使用上面的代码,但输出是数字的 ASCII 值而不是实际数字。
喜欢,输入:“0”输出:“48”。
当我尝试 (int)(str[i]-'0');
而不是 (int)str[i]);
时,我得到了正确的答案,但我不明白为什么它是正确的。
在您的代码中,
printf("%d",(int)str[i]);
打印相应char
值(数字)的ASCII值。
OTOH,
printf("%d",(int)(str[i]-'0'));
打印 char
的 ASCII 值与 0
的 ASCII 值的差异。
如果您查看 ASCII table,从 0
到 9
的 char
表示具有连续值,因此特定 char
的差异ASCII 值 0
等于任何特定数字的十进制表示。
FWIW,在这种情况下不需要转换为 (int)
,您可以直接写
printf("%d",str[i]-'0);
获取那个 char
数字的十进制值。
如果已知 str[i]
是一个数字,则 (int)(str[i]-'0')
或更简单地说 str[i] - '0'
是该数字在 0
和 9
之间的值。
原因:C 标准要求表示'0'
、'1'
、...、'9'
的字符必须完全连续。因此 '1' - '0' == 1
,所有数字依此类推。
您可以通过两种方式修改代码以执行您想要的操作。首先,将更改 printf 以打印字符表示而不是值的整数表示。
printf("%c", str[i]);
如果从键盘输入字符串“0”,将打印“0”。
您在问题中提到的另一个是:
printf("%d", (int)(str[i]-'0'));
你在这里得到正确答案的原因与计算机如何存储值有关。当您键入“0”时,它实际上并不存储值 0。它存储的是我们称为“0”的字符的 ASCII 表示形式。该值恰好是整数 48。49 表示字符“1”,依此类推。
为什么?考虑一下表示字符 "M" 或“#”。什么应该代表那些? ASCII 是 256 个字符(大约)的已知表示形式,因为这是我们可以在 1 个字节中存储的值的总数。所以,"M" 是 77,“#”是 35。
str[i] - '0' 起作用的原因与 C/C++ 处理字符的方式有关('0' 是一个字符)。字符 'M' 正好等同于值 77。所以这两行是等价的:
str[i] - '0'
与
相同
str[i] - 65
因为我输入了一个在二进制中表示为 66 的“1”(字符串),所以我减去 65 得到值 1。当我要求 printf 显示结果的整数值 (%d) 时
printf("%d", (int)(str[i] - '0'));
它打印“1”,因为 66 - 65 是 1。或者 '1' - '0' 是 1。
请记住,无论何时您查看字符串或字符,您查看的不是值的数字或二进制表示形式,而是该值的 ASCII 表示形式。
只是因为还没有解决...
不要忘记 其他 将字符数组转换为整数或浮点数的方法:
char num1[]="1234";
char num2[]="123.5";
int x = atoi(num1);
double y = atof(num2);
printf("%d\n", x);
printf("%f\n", y);
注意:strtof(,,) 是字符串到浮点数转换的另一种选择。
strtol(,,) 是将字符串转换为长整型的另一种选择。
char str[20];
printf("Enter anything\n");
scanf("%s",str);
for(int i = 0 ; i<strlen(str) ; i++)
{
if( isdigit(str[i]))
printf("%d",(int)str[i]);
}
我尝试使用上面的代码,但输出是数字的 ASCII 值而不是实际数字。 喜欢,输入:“0”输出:“48”。
当我尝试 (int)(str[i]-'0');
而不是 (int)str[i]);
时,我得到了正确的答案,但我不明白为什么它是正确的。
在您的代码中,
printf("%d",(int)str[i]);
打印相应char
值(数字)的ASCII值。
OTOH,
printf("%d",(int)(str[i]-'0'));
打印 char
的 ASCII 值与 0
的 ASCII 值的差异。
如果您查看 ASCII table,从 0
到 9
的 char
表示具有连续值,因此特定 char
的差异ASCII 值 0
等于任何特定数字的十进制表示。
FWIW,在这种情况下不需要转换为 (int)
,您可以直接写
printf("%d",str[i]-'0);
获取那个 char
数字的十进制值。
如果已知 str[i]
是一个数字,则 (int)(str[i]-'0')
或更简单地说 str[i] - '0'
是该数字在 0
和 9
之间的值。
原因:C 标准要求表示'0'
、'1'
、...、'9'
的字符必须完全连续。因此 '1' - '0' == 1
,所有数字依此类推。
您可以通过两种方式修改代码以执行您想要的操作。首先,将更改 printf 以打印字符表示而不是值的整数表示。
printf("%c", str[i]);
如果从键盘输入字符串“0”,将打印“0”。
您在问题中提到的另一个是:
printf("%d", (int)(str[i]-'0'));
你在这里得到正确答案的原因与计算机如何存储值有关。当您键入“0”时,它实际上并不存储值 0。它存储的是我们称为“0”的字符的 ASCII 表示形式。该值恰好是整数 48。49 表示字符“1”,依此类推。
为什么?考虑一下表示字符 "M" 或“#”。什么应该代表那些? ASCII 是 256 个字符(大约)的已知表示形式,因为这是我们可以在 1 个字节中存储的值的总数。所以,"M" 是 77,“#”是 35。
str[i] - '0' 起作用的原因与 C/C++ 处理字符的方式有关('0' 是一个字符)。字符 'M' 正好等同于值 77。所以这两行是等价的:
str[i] - '0'
与
相同str[i] - 65
因为我输入了一个在二进制中表示为 66 的“1”(字符串),所以我减去 65 得到值 1。当我要求 printf 显示结果的整数值 (%d) 时
printf("%d", (int)(str[i] - '0'));
它打印“1”,因为 66 - 65 是 1。或者 '1' - '0' 是 1。
请记住,无论何时您查看字符串或字符,您查看的不是值的数字或二进制表示形式,而是该值的 ASCII 表示形式。
只是因为还没有解决...
不要忘记 其他 将字符数组转换为整数或浮点数的方法:
char num1[]="1234";
char num2[]="123.5";
int x = atoi(num1);
double y = atof(num2);
printf("%d\n", x);
printf("%f\n", y);
注意:strtof(,,) 是字符串到浮点数转换的另一种选择。
strtol(,,) 是将字符串转换为长整型的另一种选择。