我写了一个接受输入字符并输出该字符的程序,比如这个
int ch = getchar();
printf("%c", ch);
它像我预期的那样工作。然后我决定先欢迎并打印Hello
。
printf("Hello!\n");
int ch = getchar();
printf("%c", ch);
令我惊讶的是,这导致编译器抛出两个错误:
错误C2065:'ch':未声明的标识符
错误C2143:语法错误:缺少';'在'type'之前
我不明白为什么添加第一行会导致这种情况发生。无论如何,我重构了程序以摆脱int
声明,错误神奇地消失了。
printf("Hello!\n");
printf("%c", getchar());
发生了什么事?什么是导致这些错误出现然后消失的魔力?
答案 0 :(得分:5)
如果您使用的是较旧的c编译器,则必须先进行所有变量声明。尝试:
int ch;
printf("Hello!\n");
ch = getchar();
printf("%c", ch);
答案 1 :(得分:3)
在C89标准中阻止阻止后创建新变量,但在较新的C99标准中允许 。
您使用的旧编译器或编译器不完全符合c99 您的代码示例应该在任何好的编译器上工作。 Works on gcc-4.3.4
替代解决方案:
你可以通过两种方式解决问题:
在块的开头声明变量:
int ch;
printf("Hello!\n");
ch = getchar();
printf("%c", ch);
或
创建一个用于声明变量的新块:
printf("Hello!\n");
{
int ch = getchar();
printf("%c", ch);
}
<强>建议:强>
你应该真的改变你的编译器,因为如果我没记错的话,gcc在c99之前支持它作为编译器扩展。
答案 2 :(得分:2)
C99之前的C版本不允许“混合声明和代码”,这意味着您必须在范围的开头声明所有变量。现代C编译器允许混合声明和代码,C ++编译器也是如此。一些非C99编译器甚至允许它作为扩展。
我认为这是为了让编译器更容易确定堆栈上实际需要多少空间,或者这些行中的某些内容。
答案 3 :(得分:0)
可能你正在使用一个非常古老的C编译器。可能是支持C89的人。 使用so强制您在块内的任何内容之前声明任何变量(例如函数或主函数) 两种出路: 首先声明ch:
int ch = getchar();
printf("Hello!\n");
printf("%c", ch);
或者更好的是,尝试更改编译器。你用的是什么操作系统?视窗? Linux呢? Mac吗?
另外,快速说明。您正在使用getchar来获取整数。
尝试使用scan而不是getchar(“%d”和&amp; ch)。或者,如果您确实需要使用getchar,并将其作为char打印,请将ch声明为char本身,如果您需要再次将其用作整数,请使用itoa函数将char转换为整数。