来自stdin的read()不会忽略换行符

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

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

当从标准输入输入数据时,通常用户在完成时按下输入。 但read()将’\ n’视为输入,在这种情况下n = 1且条件不计算为false。 当用户在标准输入上按Enter(不输入任何内容)而不检查buf的内容时,是否有办法使条件计算为false。 除了read()之外还有其他function可以用于此目的吗?

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

你问:

当从标准输入输入数据时,通常用户在完成时按下输入。 但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)

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

 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 } 

最好使用fgets()执行任务(捕获用户输入),但即使是fgets()也会在缓冲区中存储换行符。

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

我很肯定没有检查缓冲区内容就无法做到这一点。 甚至readline()就是这么做的。 无论如何,你为什么反对呢?