Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.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
C 从stdin中读取()';不要忽略换行符_C_Input_Newline_Stdin - Fatal编程技术网

C 从stdin中读取()';不要忽略换行符

C 从stdin中读取()';不要忽略换行符,c,input,newline,stdin,C,Input,Newline,Stdin,我使用以下条件语句读取标准输入 if ((n = read(0,buf,sizeof(buf))) != 0) 当从标准输入输入输入数据时,通常用户在完成时按enter键。但是read()。除了检查buf的内容外,当用户在标准输入上按enter键(不输入任何内容)时,是否有办法使条件求值为false。除了read()之外,我还可以使用其他函数吗 就这一点而言,当输入来自标准输入(stdin)时,read有什么方法来确定输入的结束呢?您最好使用fgets()来完成任务(捕捉用户输入),但即使是f

我使用以下条件语句读取标准输入

if ((n = read(0,buf,sizeof(buf))) != 0)
当从标准输入输入输入数据时,通常用户在完成时按enter键。但是
read()。除了检查buf的内容外,当用户在标准输入上按enter键(不输入任何内容)时,是否有办法使条件求值为false。除了
read()
之外,我还可以使用其他函数吗

就这一点而言,当输入来自标准输入(stdin)时,read有什么方法来确定输入的结束呢?

您最好使用
fgets()
来完成任务(捕捉用户输入),但即使是
fgets()
也会在缓冲区中存储换行符


但是,如果有换行符,您可以确定它是字符串中的最后一个字符,因此很容易将其去掉

我敢肯定,如果不检查缓冲区的内容,就没有办法做到这一点。甚至readline()也能做到这一点。无论如何,你为什么反对它?

你必须自己检查缓冲区。 e、 g

或者使用例如FGET,只需剥掉

while(fgets(buf,sizeof buf,stdin) != NULL) {
  char *ptr;
  size_t len;

  if((ptr = strchr(buf,'\n')) != NULL) //strip newline
    *ptr = 0; 
  len = strlen(buf);
  if(len == 0)
   continue;
  ... process input 
}
你问:

当从标准输入输入输入数据时,通常用户在完成时按enter键。但是read()也将“\n”视为输入,在这种情况下,n=1且条件的计算结果不为false

第一点当然是正确的。enter键相当于换行符键,因此当用户按enter键时,键盘会生成一个换行符,
read()
函数因此会返回该字符。这一点至关重要

因此,您的条件是错误的-空行将包含换行符,因此字节计数将为1。实际上,当标准输入是键盘时,只有一种方法可以让
read()
调用返回0,那就是键入“EOF”字符——在Unix上通常是control-D,在DOS上是control-Z。在Unix上,终端驱动程序将该字符解释为“即使没有换行符,也将以前的输入数据发送到程序”。如果用户没有在行中键入任何其他内容,则从
read()
返回的值将为零。如果输入来自文件,则在读取最后一个数据后,后续读取将返回0字节


如果输入来自管道,则在读取管道中的所有数据后,
read()
调用将阻塞,直到可以写入管道的最后一个文件描述符关闭;如果该文件描述符在当前进程中,则
read()
将永远挂起,即使挂起的进程将永远无法
write()
到文件描述符-当然,假设是单线程进程。

只需键入
>1而不是
=0


唯一的误报是单字符响应,后跟中断(EOF)

您想做什么?一次读取一个字符?不,正如您从条件中看到的,我正在从标准输入读取到缓冲区(或者说只是将其写入标准输出)。当用户不输入任何内容而只按enter键时,我想停止。啊,我现在明白了。我看错了。请解释一下,为什么要寻找一种不用检查缓冲区就可以确定空行的方法。我真的不明白为什么。您可以编写自己的函数来检查缓冲区,但在文件末尾返回0,在出错时返回1,在空行返回“\n”。如果一个字符一个字符地读取缓冲区,则可以使用标准函数来实现此目的;但这相当于检查缓冲区;-)。基本上,我想知道是否有可能在不检查缓冲区的情况下从标准输入终止到行的末尾。就像我从文件中读取一样,当EOF发生时,读取调用自动终止。在这种情况下,不需要检查缓冲区的内容。您无法确定缓冲区中的最后一个字符是否是换行符,因为fgets()只会在文件中有换行符时存储该换行符。如果最后一行不包含一个字符,则可能不是。@Inshalla我的意思是,如果换行符在缓冲区中,它肯定是最后一个字符。我将编辑我的文章,使其明确。首先,我在这里使用的是文件描述符,而不是文件指针。fgets()接受文件指针。我想做的是,当用户按enter键时,将条件evalate设置为false。当然,我也可以在这里判断换行符是否是最后输入的字符。您说您是从标准输入中读取的,所以无论您使用的是read(0,…)还是fread(…,stdin)或fgets(…,stdin)都无关紧要。我的帖子是基于你在问题中提供的信息。如果你想停在空行上,你可以像“If('\n'!=*fgets(buf,sizeof(buf)-1,stdin))@qrdl那样做,这当然也在检查缓冲区,但出于审美的原因,可能比其他解决方案更可取。关键的是,你需要说明为什么read()/recv()的返回值0不同于空行。如果您从read()/recv()中获得0,则表示您处于所有输入的末尾(即,它已关闭,无法添加新输入)。注意:有些设备的get
read()
返回零并不意味着无法添加更多输入。展示我的古董磁带设备就是这样一个例子。目前,终端是另一种。使用
open()
(例如O_NONBLOCK)上的深奥选项,您可以在其他设备上获得该行为。但根据定义,空行是仅包含换行符的行-行尾标记(也称为换行符)是数据的一部分。如果你不想在你的程序中,你必须删除它。只有
gets()
为您删除换行符,但您不应该在生产代码中使用它。
while(fgets(buf,sizeof buf,stdin) != NULL) {
  char *ptr;
  size_t len;

  if((ptr = strchr(buf,'\n')) != NULL) //strip newline
    *ptr = 0; 
  len = strlen(buf);
  if(len == 0)
   continue;
  ... process input 
}