检查输入是否为数字并转换为C中的ascii字符



当前遇到一个uni问题。(语言为C(

提示如下:创建一个程序从终端读取单个输入字符检查输入字符是否为数字,如果是,则将其转换为相应的整数(使用上面ASCII值的属性(将整数的值打印为八进制数(在printf的参数中使用%o说明符(或文本";输入不是数字";如果用户输入了非数字字符,例如"q"、"$"或"Z"。

我的代码如下:

int valueOfDigit(){
char c;
int i;
c = getchar();
i = c;
if (c <= '9' && c >= '1'){
printf("%o", (int) i);
}
else printf("the input is not a digitn");
return 0;
}

我没有通过测试,因为我打印的是ascii值,而不是八进制。我做错了什么?我们也不允许使用任何花哨的方法。

您的代码不起作用,因为您试图将char打印为int(我的意思是,您试图将'6'打印为6(。问题是,这些字符已经是C中的int(正如您所注意到的,它们是使用ASCII标准编码的(。简单地说,我的意思是根本不检查任何与程序安全相关的东西,你只需要做以下事情:

if (c <= '9' && c >= '0'){
printf("%o", (int)(i - '0'));
}

这将打印与ASCII中的数字相对应的整数减去ASCII零,这将导致打印的实际数字,例如ASCII中的6是54,所以减去"0",即48得到6。这是一般的想法。

你错过了家庭作业的要点。

当您键入类似"6"的字符时,程序将接收8位,其值为00110110。这是"6"的ASCII代码。

另一方面,数字6的二进制值是110(这意味着1x22+1x21+0x20(,它用零存储未使用的高值位,例如0000000000000110在16位CPU上

我们观察到,字符"6"=00110110以与整数6=110相同的位结尾,在ASCII代码中,0和9之间的所有数字都是这种情况。

因此,要从"6"转换为整数6,只需去掉高阶位即可。现在我们观察到,按照这个ASCII规则,字符"0"被编码为00110000,这正是我们必须从00110110中删除的内容才能获得数字6。这就解释了接受答案中的i - '0'部分。

printf格式"%o"%d"%x〃;,取一个像0000000000000110这样的整数值,生成ASCII字符序列,这些字符可以显示在屏幕/控制台/纸张/任何东西上。在我们的例子中,输出是一个字节"6"=二进制00110110。如果输入为"8"=二进制00111000,则整数值为8=二进制1000,printf输出为2个字节,第一个为"1"=00110001,第二个为"0"=00111000;因为所显示的值8的八进制形式是"0";10〃=1x81+0x80

最新更新