gpt4 book ai didi

C - 输入正确的代码但没有收到输出

转载 作者:太空宇宙 更新时间:2023-11-04 04:42:22 24 4
gpt4 key购买 nike

当我运行以下代码并输入一个句子时,我没有得到任何输出。光标只是转到一个新行。

我直接从书上抄下来并仔细检查了它是否有错误(kernighan & ritchie 的第 1 版 C 编程语言)

#include <stdio.h>
int main()

{
int c,i,nwhite,nother;
int ndigit[10];

nwhite=nother=0;
for(i=0;i<10;++i)
ndigit[i] = 0;

while (( c=getchar()) != EOF)
if(c>= '0' && c<= '9')
++ndigit[c-'0'];
else if (c==' ' || c == '\n' || c == '\t')
++nwhite;
else
++nother;

printf("digits =");
for( i=0; i<10; ++i)
printf("%d",ndigit[i]);
printf(", white space = %d, other = %d\n", nwhite,nother);

return 0;
}

最佳答案

由于您正在测试从其他来源复制的程序,我想您不想更改它,而是想了解它。

getchar()从标准输入中获取恰好 1 个字符,这是一个名为 stdin 的文件在标准标题中 <stdio.h> .

标准输入,stdin , 被认为是一个文件。
从形式上讲,文件结束是一个“标记”,而不是一个“字符”。
但是,一般情况下,一个特定的“字符”用于标记文本文件的“文件结束”。
在 Windows 中,“文件结束”标记是字符 CTRL-Z(其 ASCII 码为 26)。
Linxu 中的标记是CTRL-D(其ASCII 码是4)。

另一方面,标准输入通常有以下行为:

  • 等待用户输入字符,直到按下 Intro/Enter 键。

如果用户不按 Enter,则标准输入不会将控制权交还给程序。即使您输入“文件结束”字符(例如,CTRL-Z),也会发生这种情况。
但是,其他行为也是可能的。
例如,在 Ubuntu 控制台中,我无需等待按下 Enter 键即可识别 CTRL-D。

无论如何,您必须在系统的控制台中明确键入文件结束标记
因此,您必须自己按下 CTRL-Z(可能后跟 Enter)或 CTRL-D。

关于 ENTER 和 EOF

按下 Enter 后,您的程序将测试 EOF ,即您系统中的“文件结束”标记。
但是,Enter 关键字不打印“文件结束”标记,而只打印“行结束”标记,对应于标准字符换行符 '\n'。 .

因此,如果需要 while()按 Intro/Enter 后循环终止,必须针对 '\n' 进行测试,而不是 EOF .

观察

可以观察到getchar()不检索字符 CTRL-Z,因为 CTRL-Z 的 ASCII 码是 26,但是 getchar()检索负值(通常为 -1 )。
这意味着 getchar()将字符 ASCII 26 识别为文件结束标记,然后将其转换为在 C 中具有意义的值,由宏 EOF 提供,这不是 26。

我的意思是EOF不是 CTRL-Z,然后不能天真地发送 EOF假设 ASCII 26 (CTRL-Z) 将被发送到文本文件。

综上所述,我认为重要的是要阐明“文件结尾”的抽象概念,即EOF的作用。 ,以及“标记”和“字符”之间的区别。
(另一个例子:在 Windows 中,“行尾”的“标记”是一对字符 CTRL-M CTRL-J,它不仅是 1 个字符,而且是 2 个字符)。

引用自标准:

The getchar function returns the next character from the input stream pointed to by stdin. If the stream is at end-of-file, the end-of-file indicator for the stream is set and getchar returns EOF. If a read error occurs, the error indicator for the stream is set and getchar returns EOF.

关于C - 输入正确的代码但没有收到输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25068509/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com