Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C将字符视为字母,而不是一个单字节整数_C_String_Char - Fatal编程技术网

C将字符视为字母,而不是一个单字节整数

C将字符视为字母,而不是一个单字节整数,c,string,char,C,String,Char,假设我需要从用户输入中获取一个数字,从0到9。其他一切都是禁止的 我认为这个数字应该适合一个单字节整数,一个字符(0-255)。通常我看到人们在这里使用int,但这是浪费,不是吗?32位(或任何实现)只存储数字0-9 我发现下面的代码(使用shorts)是有效的,但当我将其更改为仅使用一个字节char,而不是两个字节short,它开始将用户输入视为字符串,因此如果用户输入235,convert()将不再捕获错误条件。它只返回他们号码的第一位数字 我知道C实现字符串作为字符数组。有没有一种方法可以

假设我需要从用户输入中获取一个数字,从0到9。其他一切都是禁止的

我认为这个数字应该适合一个单字节整数,一个字符(0-255)。通常我看到人们在这里使用int,但这是浪费,不是吗?32位(或任何实现)只存储数字0-9


我发现下面的代码(使用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”将工作


如果您的目的是扫描整个8位范围内的值,则必须至少短时间内扫描,如果您愿意,可以选择较低的8位。

无法使用
scanf
输入一个单字节整数。如果您的意思是格式字符串是
“%c”
,则这是一个(ascii)字符,而不是一个单字节整数。如果希望将其视为一个单字节整数,则需要自己进行转换<代码>c=c-“0”将工作

如果您的目的是扫描整个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);
    }
}