[英]What happens when using scanf(“%d”, &c) while c is a char?
代码是这样的:
char c;
scanf("%d", &c);
输入3 ...
我的猜测是,当输入3
时,它的类型为int
;
然后将其降级为char并分配给c
;
我在说明符%d
打印c
的值,结果为3,似乎与预期的一样;
但是用指定符%c
打印c
的值会在终端上显示-空白-这是一个问题...(1);
为了测试更多,我还声明了一个类型为char
的变量ch
,并像这样初始化它:
char ch = 1;
测试是这样的:
(i&j)? printf("yes") : printf("no");
结果为“否”
我打印出i&j
的值,它是0
但是1&3
应该是1
? 这是另一个问题。...(2);
我的问题是(1)和(2)
您实际上是在执行未定义的行为。
通过使用格式字符串%d
,您告诉scanf
期望一个int*
作为参数,并向其传递一个指向单个字符的指针。 请记住,与传递格式字符串中的内容相比, scanf
没有进一步的类型信息。
这将导致scanf
尝试将一个int
大小的值写入一个指向char
大小的保留的地址的内存,这可能(对于大多数体系结构)超出范围。
调用UB后,您所有的计算都将关闭。
假设scanf()不是varargs函数,而是一个以int指针作为第二个参数的普通普通函数:
int noscanf(char *format, int *ptr)
{
*ptr = 42;
return 1;
}
int main(void)
{
char ch;
int rc;
// This should *at least* give a warning ...
rc = noscanf("Haha!" , &ch);
return 0;
}
现在,scanf() 是一个varargs函数。 scanf()确定(指针)参数类型的唯一方法是检查格式字符串。 一个%d表示:下一个参数应该是一个指向int的指针。 因此scanf可以愉快地将sizeof(int)
个字节写入* ptr。
我在那里看不到变量j
。 因此, i&j
将为0。是的,如果i == 1
且j == 3
则i & j == 1
。
(i&j)? printf(“ yes”):printf(“ no”);
对于i = 1和j = 3,语句给出的输出为yes。
对于(1)问题,ASCII 3表示不可打印的STX char。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.