gpt4 book ai didi

c++ - C中整数到字符的转换

转载 作者:太空宇宙 更新时间:2023-11-03 10:21:48 25 4
gpt4 key购买 nike

让我们考虑这个片段:

int s;
scanf("%c",&s);

这里我使用int,而不是char,作为变量s,现在使用s安全地转换字符 我必须再次将其设为 char,因为当 scanf 读取一个字符时,它只会覆盖分配给它的变量的一个字节,而不是 int 的所有四个字节有。

对于转换,我可以使用 s = (char)s; 作为下一行,但是是否可以通过从 s 中减去一些内容来实现同样的效果?

最佳答案

您所做的在技术上是未定义的行为。 %c 格式需要一个 char*,您已经向它传递了一个 int*,它将(粗略地说)被重新解释。即使假设指针值在重新解释后仍然有效,将任意字符存储到 int 的第一个字节,然后将其作为 int 读回是未定义的行为。即使已定义,在 3 个字节未初始化时读取 int 也是未定义的行为。

在实践中,它可能会在您的机器上做一些有意义的事情,并且您只会在前 3 个字节中得到垃圾(假设是小端)。

编写 s = (char)s 将值从 int 转换为 char 然后再返回到 int再次。这是实现定义的行为:将超出范围的值转换为有符号类型。在不同的实现中,它可能会清除前 3 个字节,可能会返回一些其他结果,或者可能会发出信号。

正确使用scanf的方法是:

char c;
scanf("%c", &c);

然后是 int s = c;int s = (unsigned char)c;,取决于你是否希望负值字符产生负数整数或正整数(最多 255,假设为 8 位字符)。

我想不出任何不正确使用 scanf 的充分理由。不过,完全不使用 scanf 有充分的理由:

int s = getchar();

关于c++ - C中整数到字符的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2464878/

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