【问题标题】:Conversion from char to int and printing the decimal value从 char 转换为 int 并打印十进制值
【发布时间】:2015-09-01 17:42:15
【问题描述】:
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]); 时,我得到了正确的答案,但我不明白为什么它是正确的。

【问题讨论】:

  • scanf("%19s",str);会更安全
  • 今天有趣的事实,'0' == 48 == 0x30
  • @KevinDTimm:仅限 ASCII。这个问题的有趣之处在于,C 要求 'n' - '0' == n 用于 0..9 中的所有数字 n

标签: c char printf decimal ascii


【解决方案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 表示。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • @SouravGhosh 当然可以。参见C11, 5.2.1 字符集
    • @BlueMoon 对,value of each character after 0 in the above list of decimal digits shall be one greater than the value of the previous. 我的立场是正确的。谢谢。
    【解决方案3】:

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

    不要忘记将 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(,,) 是将字符串转换为长整数的另一种选择。

    【讨论】:

      【解决方案4】:

      在您的代码中,

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

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

      哦,

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

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

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

      FWIW,这种情况下不需要强制转换为(int),你可以直接写

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

      获取char 数字的十进制值。

      【讨论】:

        猜你喜欢
        • 2011-11-27
        • 2012-10-23
        • 2017-04-16
        • 2018-02-24
        • 2020-07-18
        相关资源
        最近更新 更多