繁体   English   中英

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

[英]Null terminating char array in C and difference between using read and 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从标准输入中读取时,是否有必要在字符串的末尾附加一个空字符,或者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个字符。 是否有某种方式可以读取到换行符并在每次迭代中停在那里? 从控制台接收输入时,似乎可以执行此操作。

read不会添加任何内容; 没有终止0。 readstrlen(buffer)返回的值取决于read之前缓冲区中的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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM