所以,让我们说我需要从用户输入中获取一个数字,仅从0到9.其他所有内容都超出范围。
我认为这个数字应该适合一个字节的整数,一个字符(0-255)。通常我认为人们在这里使用int,但这很浪费,不是吗? 32位(或任何实现)只是为了存储数字0-9?
我发现下面的代码(使用短片)有效,但当我将其更改为仅使用一个字节 char 时,不是一个双字节短,它开始将用户输入视为字符串,因此如果用户输入235,convert()不再捕获错误条件。它只返回其数字的第一个数字。
我知道C将字符串实现为字符数组。有没有办法使用char来表示单个一字节整数而不将其视为字符串?我应该放弃使用单字节整数作为数字的想法吗?
(为了简洁起见,我将其缩短为0-1,而不是0-9)
#include <stdio.h>
char *convert(short digit)
{
char *english;
switch (digit) {
case 0:
english = "zero";
break;
case 1:
english = "one";
break;
default:
english = "";
break;
}
return english;
}
void main(void)
{
short digit;
char *english;
printf("Enter a digit between 0 and 9: ");
scanf("%hu", &digit);
english = convert(digit);
if (english[0] == '\0') {
printf("\nYour number was invalid\n");
} else {
printf("\nYou entered the number %s\n", english);
}
}
更新
这是尝试接受字符的版本,而不是短片:
#include <stdio.h>
char *convert(char digit)
{
char *english;
switch (digit) {
case 0:
english = "zero";
break;
case 1:
english = "one";
break;
default:
english = "";
break;
}
return english;
}
void main(void)
{
char digit;
char *english;
printf("Enter a digit between 0 and 9: ");
scanf("%c", &digit);
english = convert(digit);
if (english[0] == '\0') {
printf("\nYour number was invalid\n");
} else {
printf("\nYou entered the number %s\n", english);
}
}
观察到的上述行为是输入的任何数字都被标记为无效。
答案 0 :(得分:2)
将scanf("%c", &digit);
更改为scanf("%hhd", &digit);
%c
是读取字符并存储该字符的说明符。 %d
是读取编号为10位数的数字并将其转换为整数(hh
意味着将答案写入char
)的说明符。
它与“C对待char”无关,而是与指示scanf
函数如何处理其输入有关。 char
是一个字节的整数。
此外,您的代码short digit; scanf("%hu", &digit);
不正确; %hu
是unsigned short
的说明符。使用%hd
或unsigned short digit;
。
答案 1 :(得分:1)
无法使用scanf
输入一个字节的整数。如果您的格式字符串是"%c"
,那么这是一个(ascii)字符,而不是一个字节的整数。如果您希望将其视为一个字节整数,则需要自行转换。如果提供了值0-9,c = c - '0';
将会找到。
如果您的目的是扫描整个8位范围内的值,则必须扫描至少一个短路,如果愿意,可以取低8位。
答案 2 :(得分:1)
通常我认为人们在这里使用int,但那是浪费,不是吗? 32位(或任何实现)只是为了存储数字0-9?
使用char
代替short
不会节省空间,并且在大多数情况下最有可能适得其反。
对于函数参数,编译器将生成将char
传递为int
的代码(否则堆栈将变为未对齐,这会在大多数平台上生成错误,并在大多数其他平台上严重降低机器速度
对于char
上的大多数算术运算,编译器将被强制执行整数提升(将char
扩展为int
,执行操作并截断结果。)