C 字符串比较,系统调用读取

C 字符串比较,系统调用读取,c,C,我试图从stdin读入并将输入打印到文件中,如果输入被退出,那么我想停止程序。但是,这似乎不起作用,当我键入“quit”时if子句if没有激活。这个代码有什么问题 while( (n_char = read(0, (void *)buffer, 10)) != 0){ if (strcmp(buffer, "quit") == 0){ printf("equal\n"); exit(0); } //Display the characters re

我试图从stdin读入并将输入打印到文件中,如果输入被退出,那么我想停止程序。但是,这似乎不起作用,当我键入“quit”时if子句if没有激活。这个代码有什么问题

while( (n_char = read(0, (void *)buffer, 10)) != 0){
    if (strcmp(buffer, "quit") == 0){
        printf("equal\n");
        exit(0);
    }
//Display the characters read
    n_char = write(inFile, buffer,n_char);
}
不将空字节终止添加到
缓冲区
。但是
strcmp()
希望它的参数以空字节终止

在strcmp()前面添加空字节。:

(如果
n_char
为10,则需要确保
buffer[n_char]
不会导致越界访问,即在
buffer
中至少有一个额外字节用于空终止。另一方面,可以使用strncmp()`)

而且,你的情况是错误的
read()
可以在通过条件的错误时重新运行-1。将其更改为:

while( (n_char = read(0, buffer, 10)) > 0) {

请注意,我删除了对
void*

的不必要强制转换。请提供一个工作示例。您应该只在C样式字符串上使用
str*
函数。每个函数的文档都清楚地说明了它们的输入必须是字符串,而不是从文件或网络连接读取的任意数据块。@InnoveerHipstirt Check id在输入读取中有一个换行符。嘿,谢谢,我忘了。现在我可以让它工作了。strncmp也可以工作!实际上它应该是buffer[n_char-1]=0@InnoveerHipstirt只有当缓冲区恰好包含一个换行符(并且您希望删除它)时才是这样——您的输入似乎就是这样。通常,如果read()读取N个字节,那么您希望在第N个索引处插入空字节,以便将其用作C字符串。举个例子:如果
read()
返回
abc
,那么N将是3,缓冲区[3]是空终止符的位置。
while( (n_char = read(0, buffer, 10)) > 0) {