gpt4 book ai didi

c - 2 位以上字符的 Scanf 值?

转载 作者:行者123 更新时间:2023-11-30 20:11:04 24 4
gpt4 key购买 nike

    int main(){
char c;
scanf("%c", &c);
printf("%d\n", c);
}

假设用户输入 71 并按 Enter 键。

为什么c没有变成71,为什么它只读取7而不读取1

最佳答案

您似乎忽略了一些关键区别。

scanf函数将字符串作为输入。每个字符都是一个 8 位整数,代表以下之一:

  • 可打印的字形,例如“7”、“1”或“G”
  • 控制字符,例如换行符 ('\n') 或 bel ('\a')
  • nul 终止符 ( \0 ),用于标记字符串的结尾。

(为了简单起见,我假设使用 ASCII,也可以使用其他编码)。

打印时,可打印字符在屏幕上显示为字母、数字或符号。控制字符控制您的终端/显示设备的功能(换行符使其将概念光标移动到下一行,bel 使某些终端发出蜂鸣声)。

<小时/>

什么scanf这串输入字符的作用由格式字符串控制:

  • %c将传入字符不进行转换读取为 char值(value)观。

  • %d将 '0'..'9' 范围内的字符序列(即值 0x30..0x39)转换为整数。

因此,当字符“7”被扫描为 %c 的字符时,它给出的值是 0x37(十进制 55),仍然假设是 ASCII。当使用%d将相同的字符扫描为整数时,取值为 7。

如果要扫描字符串“71”,作为整数值,请使用 %d (或者 %hhd 如果由于某种原因你确实想将它存储在一个字符中)。

<小时/>

现在,我们终于可以解决这个评论了:

... if an integer is only 4 bytes, how can I scan a 5 digit integer?

让我们考虑字符串文字“12345”,它在内存中存储为

const char literal[6] = {0x31, 0x32, 0x33, 0x34, 0x35, 0x00};

如果您使用 %d 扫描此内容,那么这 5 个非 null 字节将被转换为以 10 为基数的整数,转换为值 12345。

但是,如果您使用 %5c 扫描相同的字符串,您将使用值 {0x31, 0x32, 0x33, 0x34, 0x35} 填充 5 个字符的缓冲区。如果您尝试使用普通 %c当然,它只会读取第一个字符,即 0x31。

关于c - 2 位以上字符的 Scanf 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42232055/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com