繁体   English   中英

当c是char时使用scanf(“%d”,&c)会发生什么?

[英]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 == 1j == 3i & 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM