5

我正在使用以下条件语句从标准输入中读取。

if ((n = read(0,buf,sizeof(buf))) != 0)

当从标准输入输入数据时,一般用户在完成后按回车键。但是read()在这种情况下也将 '\n' 视为输入,n = 1并且条件不会评估为假。除了检查 buf 的内容之外,当用户在标准输入上按 enter(不输入任何内容)时,有没有办法使条件评估为 false。read()除了我可能用于此目的之外,还有其他功能吗?

就此而言,当输入来自标准输入(stdin)时,读取确定输入结束的方法是什么?

4

5 回答 5

9

你问:

当从标准输入输入数据时,一般用户在完成后按回车键。但是 read() 也将 '\n' 视为输入,在这种情况下 n = 1 并且条件不会评估为假。

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

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

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

于 2009-08-06T07:51:50.600 回答
2

只需键入>1而不是!=0

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

于 2011-06-16T01:59:01.557 回答
1

您必须自己检查缓冲区。例如

while((n = read(0,buf,sizeof(buf))) > 0) {
  if(buf[0] == '\n') // won't handle pressing 9 spaces and then enter
    continue;
  ... process input

}

或者使用例如 fgets,然后去掉 \n

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 
}
于 2009-08-06T07:43:08.963 回答
0

您最好fgets()用于您的任务(捕获用户输入),但甚至fgets()将换行符存储在缓冲区中。

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

于 2009-08-06T07:02:37.033 回答
0

我很肯定如果不检查缓冲区内容就无法做到这一点。甚至 readline() 也能做到这一点。反正你为什么反对?

于 2009-08-06T07:05:01.397 回答