从char转换为int并打印十进制值

时间:2015-06-16 18:33:01

标签: c char printf decimal ascii

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]);时,我得到了正确答案,但我不明白为什么这是正确的。

4 个答案:

答案 0 :(得分:3)

有两种方法可以修改代码以执行您想要的操作。第一种方法是更改​​printf以打印字符表示而不是值的整数表示。

printf("%c", str[i]);

将打印&#34; 0&#34;给出字符串&#34; 0&#34;从键盘。

您在问题中提到的另一个是:

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

您在此获得正确答案的原因必须是处理计算机如何存储值。当你键入&#34; 0&#34;时,它实际上并不存储值0.它存储了我们称之为#34; 0&#34;的字符的ASCII表示。该值恰好是整数48. 49表示字符&#34; 1&#34;等等。

为什么呢?好好想想代表角色&#34; M&#34;或许&#34;#&#34;。应该代表什么? ASCII是一个已知的256个字符的表示(大致),因为它是我们可以存储在1个字节中的值的总数。所以,&#34; M&#34;是77和#34;#&#34;是35岁。

str [i] - &#39; 0&#39;作品与C / C ++处理字符的方式有关(&#39; 0&#39;是一个字符)。角色&#39; M&#39;完全等价于77.所以这两行是等价的:

str[i] - '0'

相同
str[i] - 65

因为我输入了&#34; 1&#34; (字符串)在二进制中表示为66,I减去65,我得到1,该值。当我要求printf显示我的结果的整数值(%d)时

printf("%d", (int)(str[i] - '0'));
它打印&#34; 1&#34;因为66-65是1.或者&#39; 1&#39; - &#39; 0&#39;是1。

请记住,只要您查看字符串或字符,而不是查看某个值的数字或二进制表示,您就会查看该值的ASCII表示形式

答案 1 :(得分:2)

如果已知str[i]为数字,则(int)(str[i]-'0')或更多str[i] - '0'09之间此数字的值。

原因是:C标准要求表示'0''1',...,'9'的字符必须完全连续。因此'1' - '0' == 1,等等所有数字。

答案 2 :(得分:2)

仅仅因为它尚未得到解决......

不要忘记其他方式将char数组转换为整数或浮点数:

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(,,) 是将字符串转换为long int的另一种选择。

答案 3 :(得分:1)

在您的代码中,

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

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

OTOH,

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

打印char的ASCII值与0的ASCII的差异。

如果您查看ASCII tablechar0的{​​{1}}表示具有连续值,那么特定9与ASCII的差异char的值等于任何特定数字的十进制表示。

FWIW,在这种情况下不需要转换为0,你可以直接写

(int)

获取该 printf("%d",str[i]-'0); 数字的十进制值。