C中的整数到字符转换

wha*_*cko 1 c c++ casting

让我们考虑这个片段:

int s;
scanf("%c",&s);
Run Code Online (Sandbox Code Playgroud)

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

对于转换我可以s = (char)s;用作下一行,但是可以通过从中减去一些来实现它s吗?

Ste*_*sop 8

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

在实践中,它可能在您的机器上做了一些合理的事情,并且您只是在前3个字节中获得垃圾(假设是小端).

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

使用scanf的正确方法是:

char c;
scanf("%c", &c);
Run Code Online (Sandbox Code Playgroud)

然后或者int s = c;int s = (unsigned char)c;,根据是否要负值的字符以产生一个负整数或正整数(最多255个,假设8位字符).

我想不出有什么理由不正确地使用scanf.但是,根本没有使用scanf的充分理由:

int s = getchar();
Run Code Online (Sandbox Code Playgroud)