s_i*_*bhu 4 c stdin newline input
我使用以下条件语句来读取标准输入.
if ((n = read(0,buf,sizeof(buf))) != 0)
Run Code Online (Sandbox Code Playgroud)
当从标准输入输入数据时,通常用户在完成时按下输入.但read()在这种情况下n = 1也将'\n'视为输入,并且条件不会评估为false.当用户在标准输入上按下enter(不输入任何内容)而不检查buf的内容时,是否有办法使条件计算为false.除了read()我可能用于此目的之外还有其他功能吗?
就此而言,当输入来自标准输入(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()文件描述符 - 当然,假设是单线程进程.