c - K&R C 书中的基本 getchar() 相关函数不起作用?

标签 c eof stdio

<分区>

#include <stdio.h>

main()
{
    double nc;

    for(nc=0; getchar()!=EOF; ++nc);
    printf("%1d\n",nc);
}

我是第一次学C,有些地方好像不是很懂。 for 循环有一个相当简单的结构,唯一的限制是如果 getchar 不等于 EOF(无论 EOF 的值设置为什么)。每次 getchar 不等于 EOF 时,nc 都会递增。最后,我们将 nc 调整为字符串的长度,从而退出 for 循环。

然而,该程序仅接受输入,而不显示应与字符长度相关联的值。 我不明白什么?我假设这本书比我更有可能是正确的,所以我想我哪里出错了。

最佳答案

程序一直读取输入,直到到达输入的末尾。如果您在终端上打字,则需要了解如何指示输入结束。在 Windows 上,按 Ctrl+Z,然后按 Enter。在类 Unix 系统(Linux、macOS 等)上,在一行的开头按 Ctrl+D。或者,让程序从文件中读取:在 Windows 命令行上,运行 myprogram.exe <somefile.txt .在类 Unix 命令行上,运行 ./myprogram <somefile.txt .

一旦程序确实到达文件末尾,它可能会崩溃或打印出无意义的值,因为您的 printf 中存在错误。陈述。 nc是一个浮点值,但是 %d需要一个整数值(更准确地说,一个 int 类型的值)。以下是三种有效的组合:

  • 整数:

    int nc;
    …
    printf("%d\n", nc);
    
  • 较大的整数,如 K&R 中的第一个示例 — 注意它是小写 l , 不是数字 1 :

    long nc;
    …
    printf("%ld\n", nc);
    
  • float ,可能允许更大的值(在现代 PC 上,它在 32 位程序中允许比 long 更大的值,但在 64 位程序中允许比 long 更大的值):

    double nc;
    …
    printf("%f\n", nc);
    

一个好的编译器会警告您不匹配 printf .确保您已启用警告。例如,这里是 gcc -Wall -O aliman.c不得不说一下你的程序:

aliman.c:3:1: warning: return type defaults to ‘int’ [-Wreturn-type]
 main()
 ^
aliman.c: In function ‘main’:
aliman.c:9:5: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘double’ [-Wformat=]
     printf("%1d\n",nc);
     ^
aliman.c:13:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^

关于main的返回类型的警告是因为main()是一个过时的快捷方式,在现代 C 中你需要编写 int main() . (如果你很迂腐,就把它设为 int main(void)。)最后一个警告说没有 return。声明——main函数必须返回一个值(通常,它表示程序是成功还是失败)。这两个主题都将在 §1.7 中介绍。

关于c - K&R C 书中的基本 getchar() 相关函数不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45654840/

相关文章:

unix - C stdio 输入流如何实现行缓冲?

Clang stdio,找不到 h 文件

c - c程序中的sudo权限问题

c - 将文件内容扫描到结构数组中

java - 保存互联网图标然后重新打开会导致 image4j 出现 EOF

python - token 错误 : EOF in multi-line statement

c - 在库之间共享 FILE 指针

java - 使用调用 API 的 JNI 内存管理

c - 在 if(0) 中用四个 nop 修复了错误,世界不再有意义

c - c中的strlen函数