为什么getchar打电话给printf停止工作?

时间:2012-05-02 02:39:25

标签: c io printf

我写了一个接受输入字符并输出该字符的程序,比如这个

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());

发生了什么事?什么是导致这些错误出现然后消失的魔力?

4 个答案:

答案 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转换为整数。