C将char视为字母,而不是单字节整数

时间:2014-03-22 23:14:35

标签: c string char

所以,让我们说我需要从用户输入中获取一个数字,仅从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);
    }
}

观察到的上述行为是输入的任何数字都被标记为无效。

3 个答案:

答案 0 :(得分:2)

scanf("%c", &digit);更改为scanf("%hhd", &digit);

%c是读取字符并存储该字符的说明符。 %d是读取编号为10位数的数字并将其转换为整数(hh意味着将答案写入char)的说明符。

它与“C对待char”无关,而是与指示scanf函数如何处理其输入有关。 char 一个字节的整数。

此外,您的代码short digit; scanf("%hu", &digit);不正确; %huunsigned short的说明符。使用%hdunsigned 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,执行操作并截断结果。)