【问题标题】:getchar() causes error while scanf don't [duplicate]getchar() 导致错误,而 scanf 不 [重复]
【发布时间】:2018-04-15 10:46:40
【问题描述】:
#include<stdio.h>
void main() {
char ch;
ch=getchar();
printf("%d",ch);
}

这给了我错误 NZEC(非零退出代码)但是当我使用时-

#include<stdio.h>
void main() {
char ch;
scanf("%c",&ch);
printf("%d",ch);
}

没有执行错误并接受解决方案 getchar() 有什么问题?

我对 C 很陌生,所以不太了解我检查了几个关于 scanf 和 getchar 之间区别的答案,但我无法理解。请帮助我理解这种行为。

解决方案: 我不知道我的查询与这个问题有关: What should main() return in C and C++?

此外,这两个都有效-

#include<stdio.h>
void main() {
int ch;
ch=getchar();
printf("%d",ch);
}

char 更改为int 并且-

#include<stdio.h>
int main(void) {
char ch;
ch=getchar();
printf("%d",ch);
return 0;
}

void 更改为int

【问题讨论】:

  • main 函数应该被声明为返回一个int。它是 C 规范的一部分。不这样做会导致undefined behavior。参见例如this main function reference 了解更多信息。
  • 这给了我错误 NZEC(非零退出代码) 这就是您使用 void main() 得到的结果
  • 您是否碰巧收到了编译器的警告?
  • 我在网上为hacker earth运行了这个...执行错误,但代码编译成功。

标签: c scanf getchar


【解决方案1】:

两者都是未定义的行为,因为 main 应该返回 C 标准定义的 int。当您检查它的返回码时,这一点尤其重要。

将定义改为:

int main(void)
{
    ...
}

请注意,由于C99main 不需要显式返回任何值。就好像你最后有return 0;。但如果您使用的是 C89,则需要显式返回一个值(或调用 exit)。

【讨论】:

  • 按照@user3121023的建议将char ch更改为int ch,因为我正在学习c我应该使用哪个标准以及如何实际学习,所以还有一个问题@usr如果你能推荐它任何好的来源,以便有一天我可以像你一样回答谢谢!
  • 尽可能使用最新的标准 C11(但 C11 的支持/使用并不普遍)。否则,我建议关注 C99。
  • 任何你喜欢推荐的学习 c 的好资源
  • K&R 第 2 版适合练习(有点书本身已经过时)。我听说“C Programming: A Modern Approach”非常好(涵盖 c99)。但根据您的水平,您可能也喜欢“C 如何编程(第 8 版)”。但其他人可能有不同的看法。您可以搜索和阅读其他教科书(质量)。
【解决方案2】:

您的main() 应该返回int 而不是void,正如n1570 标准中指定的那样

它应该用 int 的返回类型定义并且没有参数: int main(void) { /* ... */ }

将错误代码块替换为

int  main() {
        char ch;
        ch=getchar();
        printf("%d",ch);
        return 0;
}

【讨论】:

    猜你喜欢
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    • 2013-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    相关资源
    最近更新 更多