从char到int的转换和打印十进制值 charstr[20]; printf(“输入任何内容”); scanf(“%s”,str); 对于代码中的(int i=0;i

从char到int的转换和打印十进制值 charstr[20]; printf(“输入任何内容”); scanf(“%s”,str); 对于代码中的(int i=0;i,c,char,printf,decimal,ascii,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]); } 打印相应char值(数字)的ASCII值 奥托 打印char的ASCII值与0的ASCII值之差 如果查看从0到9的char表示具有连续值,则特定char与ASCII值0的差值

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]);
}
打印相应
char
值(数字)的ASCII值

奥托

打印
char
的ASCII值与
0
的ASCII值之差

如果查看从
0
9
char
表示具有连续值,则特定
char
与ASCII值
0
的差值等于任何特定数字的十进制表示

FWIW,转换为
(int)
不是必需的。在这种情况下,您可以直接编写

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

要获取该字符的十进制值。

如果已知
str[i]
是一个数字,
(int)(str[i]-'0')
或者更简单地说
str[i]-'0'
0
9
之间的这个数字的值


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

有两种方法可以修改代码以执行所需操作。第一种方法是将printf更改为print是值的字符表示形式,而不是整数表示形式

 printf("%d",str[i]-'0);
如果输入键盘上的字符串“0”,将打印“0”

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

printf("%c", str[i]);
这里得到正确答案的原因在于计算机如何存储值。当您键入“0”时,它实际上并不存储值0。它存储的是我们称为“0”的字符的ASCII表示形式。该值恰好是整数48。49表示字符“1”,依此类推

为什么?我们可以考虑用字符“M”或“#”来表示。这些字符应该用什么来表示呢?ASCII是256个字符(大致)的已知表示形式,因为这是我们可以存储在一个字节中的值的总数。因此,“M”是77,“#”是35

str[i]-“0”工作的原因与C/C++处理字符的方式有关(“0”是一个字符)。字符“M”与值77完全相等。因此,这两行是等效的:

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

str[i] - '0'
因为我输入一个“1”(字符串),在二进制中表示为66,所以我减去65,得到1,即值

str[i] - 65
它打印“1”,因为66-65是1。或者“1”-“0”是1


请记住,任何时候当您查看字符串或字符时,您不是在查看值的数字或二进制表示形式,而是在查看该值的ASCII表示形式。

只是因为尚未对其进行寻址

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

printf("%d", (int)(str[i] - '0'));
注意:是字符串浮动对话的另一个选项。

是将字符串转换为长整数的另一个选项。

编写
scanf(“%19s”,str)会更安全
今天有趣的事实,'0'==48==0x30@KevinDTimm:仅限ASCII。这个问题中有趣的一点是,C要求
0..9
@SouravGhosh中的所有数字
n'-'0'==n
,这是肯定的。参见C11,5.2.1字符sets@BlueMoon右,上面li中0之后每个字符的
值小数位数的st应比前一位的值大一个。
I已更正。谢谢。
printf("%d", (int)(str[i] - '0'));
char num1[]="1234";
char num2[]="123.5";
int x = atoi(num1);
double y = atof(num2);  
printf("%d\n", x);
printf("%f\n", y);