为什么c中的一个整数变量在将字符值粘贴到它之后会打印它的旧值

  • 本文关键字:字符 之后 打印 变量 整数 一个 c
  • 更新时间 :
  • 英文 :


在用c构建堆栈程序时,我发现了一些奇怪的东西(不是对所有人来说,而是对一个使用web技术的人来说。(我使用了一个选择变量(整数类型(,它可以操作开关。这在一个循环中发生,如下面的代码片段所示。

do {
printf("ntEnter your choice for the operation: ");
scanf("%d", &choice);
getchar();
printf("%d", choice);
switch (choice)
{
case 1:
{
printf("ntEnter the token to be inserted:");
token = getchar();
push(token);
show();
break;
}
case 2:
{
token = pop();
if (TOP > -1)
printf("ntThe token deleted is %c", token);
show();
break;
}
case 3:
{
show();
break;
}
default:
printf("ntWrong choice");
getchar();
}
printf("ntDo you want to continue(y/n): ");
ch = getchar();
} while (ch == 'y' || ch == 'Y');

假设您正在运行这样的测试用例示例测试用例在第二次迭代中,当我将选择作为字符传递时,为什么选择使用其旧值2?

scanf中的格式%d接受(使用(以十进制表示整数的字符序列。如果输入的字符与所需格式不匹配,scanf将失败并返回,而不修改收件人变量。你的案子就是这样。i不是格式%d的有效输入。CCD_ 6立即失效,CCD_。

因为(C99 7.19.6.2p10,重点是我的("i""%d"导致"匹配失败"。

[…]输入项[…]被转换为适合转换说明符的类型如果输入项不是匹配的序列,则指令执行失败:这种情况是匹配失败。[…]

您应该始终使用<stdio.h>中的原型测试大多数函数的返回值

if (scanf("%%", ...) != EXPECTED) /* error */;

最新更新