C中的Null终止char数组以及使用read和fgets之间的区别

时间:2014-10-14 21:01:07

标签: c fgets

我做了类似这样的事情来阅读标准输入。

char *lines[50];
char buffer[50];

while((fgets(buffer, sizeof(buffer), stdin))!=NULL) {
    buffer[strlen(buffer)-1] = '\0';
    lines[i] = malloc(strlen(buffer));
    memcpy(lines[i++], buffer, strlen(buffer));
}

我想使用read系统调用做类似的事情。

while((nread=read(0, buffer, sizeof(buffer)))>0) {
    buffer[strlen(buffer)-1] = '\0';
    lines[i] = malloc(strlen(buffer));
    memcpy(lines[i++], buffer, strlen(buffer));
}

将i重置为0并使用printf("%s", lines[i])打印出字符串,我得到第一种方法的正确结果,但在第二种方法中并不总是对应的结果。为什么是这样?

另外,当使用read从标准输入读取时,是否需要在字符串的末尾附加一个空字符或者是否为您执行此操作?

我从包含以下内容的文件中指导输入:

This is test input
This is another test input

Not reading correctly, not reading correctly

当我使用fgets()获取输入后打印时,我得到与输出完全相同的内容。

当我使用read()获取输入后进行打印时,我得到了这个:

This is test input
This is another test input

Not
reading correctly, not reading correctly
put

No

附加说明:

如果我将char buffer[50]更改为更大的值,则第二种情况有效,但我不明白为什么它不适用于此特定实例。

当我从文件重定向输入时,问题似乎是read读取所有50个字符。有没有什么方法可以读取换行符并在每次迭代时停止?从控制台接收输入时似乎这样做。

1 个答案:

答案 0 :(得分:4)

read不会添加任何内容;没有终止0.在read之后,strlen(buffer)返回任何内容,具体取决于read之前缓冲区中的内容。好消息是,您根本不需要拨打strlen,因为read会返回一些传输的字符:

while((nread = read(0, buffer, sizeof(buffer) - 1))>0) {
    buffer[nread] = '\0';
    lines[i] = malloc(nread + 1));
    memcpy(lines[i], buffer, nread + 1);
}

PS:不要忘记对-1进行nread测试。