C将字符视为字母,而不是一个单字节整数
假设我需要从用户输入中获取一个数字,从0到9。其他一切都是禁止的 我认为这个数字应该适合一个单字节整数,一个字符(0-255)。通常我看到人们在这里使用int,但这是浪费,不是吗?32位(或任何实现)只存储数字0-9C将字符视为字母,而不是一个单字节整数,c,string,char,C,String,Char,假设我需要从用户输入中获取一个数字,从0到9。其他一切都是禁止的 我认为这个数字应该适合一个单字节整数,一个字符(0-255)。通常我看到人们在这里使用int,但这是浪费,不是吗?32位(或任何实现)只存储数字0-9 我发现下面的代码(使用shorts)是有效的,但当我将其更改为仅使用一个字节char,而不是两个字节short,它开始将用户输入视为字符串,因此如果用户输入235,convert()将不再捕获错误条件。它只返回他们号码的第一位数字 我知道C实现字符串作为字符数组。有没有一种方法可以
我发现下面的代码(使用shorts)是有效的,但当我将其更改为仅使用一个字节char,而不是两个字节short,它开始将用户输入视为字符串,因此如果用户输入235,convert()将不再捕获错误条件。它只返回他们号码的第一位数字 我知道C实现字符串作为字符数组。有没有一种方法可以使用char表示单个单字节整数,而不将其视为字符串?我应该放弃使用一字节整数作为数字的想法吗 (为了简洁起见,我将其缩短为0-1,而不是0-9)
#包括
字符*转换(短数字)
{
char*英语;
开关(数字){
案例0:
english=“零”;
打破
案例1:
english=“一”;
打破
违约:
english=“”;
打破
}
返回英语;
}
真空总管(真空)
{
短数字;
char*英语;
printf(“输入一个介于0和9之间的数字:”);
扫描频率(“%hu”和数字);
英语=转换(数字);
如果(英语[0]='\0'){
printf(“\n您的号码无效\n”);
}否则{
printf(“\n您输入了数字%s\n”,英语);
}
}
更新:
以下是接受字符而不是短字符的尝试版本:
#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);
}
}
#包括
字符*转换(字符数字)
{
char*英语;
开关(数字){
案例0:
english=“零”;
打破
案例1:
english=“一”;
打破
违约:
english=“”;
打破
}
返回英语;
}
真空总管(真空)
{
字符数字;
char*英语;
printf(“输入一个介于0和9之间的数字:”);
扫描频率(“%c”和数字);
英语=转换(数字);
如果(英语[0]='\0'){
printf(“\n您的号码无效\n”);
}否则{
printf(“\n您输入了数字%s\n”,英语);
}
}
观察到的上述行为是,输入的任何数字都被标记为无效。无法使用
scanf
输入一个单字节整数。如果您的意思是格式字符串是“%c”
,则这是一个(ascii)字符,而不是一个单字节整数。如果希望将其视为一个单字节整数,则需要自己进行转换<代码>c=c-“0”如果提供了值0-9,则代码>将工作
如果您的目的是扫描整个8位范围内的值,则必须至少短时间内扫描,如果您愿意,可以选择较低的8位。无法使用
scanf
输入一个单字节整数。如果您的意思是格式字符串是“%c”
,则这是一个(ascii)字符,而不是一个单字节整数。如果希望将其视为一个单字节整数,则需要自己进行转换<代码>c=c-“0”如果提供了值0-9,则代码>将工作
如果您的目的是扫描整个8位范围内的值,则必须至少短时间内扫描,如果您愿意,可以选择较低的8位
通常我看到人们在这里使用int,但这是浪费,不是吗?32位(或任何实现)只存储数字0-9
使用char
而不是short
不会节省空间,在大多数情况下很可能适得其反
对于函数参数,编译器将生成以char
s作为int
s传递的代码(否则,堆栈将变得不对齐,这将在大多数平台上产生故障,并在大多数其他平台上严重减慢机器速度)
对于char
s上的大多数算术运算,编译器将被迫执行整数提升(将char
扩展到int
,执行该运算并截断结果)
通常我看到人们在这里使用int,但这是浪费,不是吗?32位(或任何实现)只是用来存储数字0-9
使用char
而不是short
不会节省空间,在大多数情况下很可能适得其反
对于函数参数,编译器将生成以char
s作为int
s传递的代码(否则,堆栈将变得不对齐,这将在大多数平台上产生故障,并在大多数其他平台上严重减慢机器速度)
对于char
s上的大多数算术运算,编译器将被迫执行整数提升(将char
扩展到int
,执行运算并截断结果)。更改scanf(“%c”、&digit);
到scanf(“%hhd”、&digit);
%c
是用于读取字符并存储该字符的说明符。%d
是用于读取以10位为基数的数字并将其转换为整数的说明符(其中hh
表示将答案写入char
)
这与“C如何处理字符”无关,而是与您指示scanf
函数如何处理其输入有关。char
是一个单字节整数
此外,您的代码短数字;scanf(%hu,&digit);
不正确;%hu
是无符号短数字的说明符。%hd
或无符号短数字;
将scanf(%c,&digit);
更改为scanf(%hhd,&digit);
%c
是读取字符并存储该字符的说明符。%d
是读取以10位为基数的数字并将其转换为整数的说明符(其中hh
表示将答案写入
#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);
}
}