Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
getchar()并将循环条件化为使用特定字符中断_C_Getchar_Kernighan And Ritchie_Fedora 25 - Fatal编程技术网

getchar()并将循环条件化为使用特定字符中断

getchar()并将循环条件化为使用特定字符中断,c,getchar,kernighan-and-ritchie,fedora-25,C,Getchar,Kernighan And Ritchie,Fedora 25,我正在写一本臭名昭著的书《Prentice Hall软件系列》,尝试他们编写的代码,并对其进行修改,以进一步了解C 我正在控制台的Fedora 25上与VIM一起工作。下面的代码是书中的一段引用,我知道“int”以及argc和argv等都丢失了 Kernighan和Ritchie-C编程语言:第20页 因此,通常如果我输入'a',while条件应该中断,程序应该终止。当我试着运行它并输入“a”时,它不会。这里有什么问题 谢谢你们 代码没有问题(除了main的古老声明) 通常,在Unix上,文件的

我正在写一本臭名昭著的书《Prentice Hall软件系列》,尝试他们编写的代码,并对其进行修改,以进一步了解C

我正在控制台的Fedora 25上与VIM一起工作。下面的代码是书中的一段引用,我知道“int”以及argc和argv等都丢失了

Kernighan和Ritchie-C编程语言:第20页

因此,通常如果我输入'a',while条件应该中断,程序应该终止。当我试着运行它并输入“a”时,它不会。这里有什么问题


谢谢你们

代码没有问题(除了
main
的古老声明)

通常,在Unix上,文件的结尾由ctrl-D通知程序。如果您直接或在点击新行后点击ctrl-D,程序将读取
EOF

然而,上述简短的解释隐藏了许多微妙之处

在Unix中,终端输入可以在两种模式之一(称为IIRC raw和CHOOD)下运行。在熟食模式(默认模式)下,操作系统将缓冲来自终端的输入,直到它读取新行或ctrl-D字符。然后它将缓冲输入发送到您的程序

最终,您的程序将使用
read
系统调用来读取输入<代码>读取将返回读取的字符数,但通常会阻止,直到有一些字符要读取
getchar
然后将它们逐个传递给调用方。因此,
getchar
在处理该行中的任何字符之前,将一直阻塞,直到收到整行文本。(这就是为什么在使用
a
时它仍然不起作用的原因)


按照惯例,
read
系统调用在文件结束时返回0。这就是
getchar
知道如何向调用者返回
EOF
。ctrl-D的作用是强制
read
读取并清空缓冲区(如果它在新行之后立即发送),这使得它看起来像是到达了EOF,即使没有人关闭输入流。这就是为什么在新行之后直接按ctrl-D键有效,但在输入某些字符后按ctrl-D键无效的原因

代码没有问题(除了
main
的古老声明)

通常,在Unix上,文件的结尾由ctrl-D通知程序。如果您直接或在点击新行后点击ctrl-D,程序将读取
EOF

然而,上述简短的解释隐藏了许多微妙之处

在Unix中,终端输入可以在两种模式之一(称为IIRC raw和CHOOD)下运行。在熟食模式(默认模式)下,操作系统将缓冲来自终端的输入,直到它读取新行或ctrl-D字符。然后它将缓冲输入发送到您的程序

最终,您的程序将使用
read
系统调用来读取输入<代码>读取将返回读取的字符数,但通常会阻止,直到有一些字符要读取
getchar
然后将它们逐个传递给调用方。因此,
getchar
在处理该行中的任何字符之前,将一直阻塞,直到收到整行文本。(这就是为什么在使用
a
时它仍然不起作用的原因)


按照惯例,
read
系统调用在文件结束时返回0。这就是
getchar
知道如何向调用者返回
EOF
。ctrl-D的作用是强制
read
读取并清空缓冲区(如果它在新行之后立即发送),这使得它看起来像是到达了EOF,即使没有人关闭输入流。这就是为什么在新行之后直接按ctrl-D键有效,但在输入某些字符后按ctrl-D键无效的原因

学习C的第一件事是:int main。我知道它实际上是“int main”(int argc,char*argv[])我引用了这本书,它是这样写的,所以请跟我谈谈。找一本更好的书。最好是第一次正确地学习东西,然后需要以后再去学习。@n.m.先生,挑剔,
int main(void)
。:)自从K&R写了他们的书以来,C发生了很大的变化。甚至他们关于ANSI C的书中也包含了一些代码示例,这些示例将在遵循当前C标准修订版的现代编译器中出现。首先要了解的是C:int-main。我知道它实际上是“int-main(int-argc,char*argv[])我引用了这本书,它是这样写的,所以请跟我说说,找一本更好的书。最好是第一次正确地学习东西,然后以后再去学习。@n.m.先生,吹毛求疵,
intmain(void)
。:)自从K&R写了他们的书后,C发生了很大的变化。即使是他们关于ANSIC的书中也包含了一些代码示例,这些示例将在遵循当前C标准修订版的现代编译器中得到突破。感谢您提供了这一非常有见地的解释,这现在是非常有意义的!谢谢你的深刻解释,现在完全有道理了!
#include <stdio.h>
/* copy input to output; 1st version  */   
main(){       
    int c;
    c = getchar();       
    while (c != EOF) {           
        putchar(c);           
        c = getchar();       
    }   
}
...
while (c != 'a') {
...