C语言 从字符转换为 int 并打印十进制值


char str[20];
printf("Enter anythingn");
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 以打印字符表示形式,而不是值的整数表示形式。

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

因为我输入了一个"1"(字符串),它在二进制文件中表示为 66,所以我减去 65,得到 1,值。当我要求 printf 显示结果的整数值 (%d) 时

printf("%d", (int)(str[i] - '0'));

它打印"1",因为 66 - 65 是 1。或"1"-"0"是1。

请记住,任何时候您查看

字符串或字符时,您不是在查看值的数字或二进制表示形式,而是在查看该值的 ASCII 表示形式。

如果已知str[i]是一个数字,则(int)(str[i]-'0')或更简单地说,str[i] - '0'是该数字的值介于09之间。

原因是:C标准要求表示'0''1'、...、'9'的字符是完全连续的。 因此,所有数字都'1' - '0' == 1,依此类推。

只是因为它还没有被解决...

不要忘记将字符数组转换为整数或浮点数的另一种方法:

char num1[]="1234";
char num2[]="123.5";
int x = atoi(num1);
double y = atof(num2);  
printf("%dn", x);
printf("%fn", y);

注意:strtof(,,) 是字符串浮点转换的另一个选项。
strtol(,,) 是将字符串转换为长整型的另一种选择。

在你的代码中,

 printf("%d",(int)str[i]);

打印相应char值(数字)的 ASCII 值。

奥托,

printf("%d",(int)(str[i]-'0'));

打印 char 的 ASCII 值和 0 的 ASCII 之差。

如果您查看 ASCII 表,从 09char表示形式具有连续值,因此特定char与 ASCII 值 0 的差值等于任何特定数字的十进制表示形式。

FWIW,在这种情况下不需要演员表 (int),可以直接写

 printf("%d",str[i]-'0);

以获取该char位数字的十进制值。

相关内容

  • 没有找到相关文章

最新更新