【发布时间】:2019-06-18 11:23:42
【问题描述】:
我正在尝试逐行读取标准文件输入。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#define BUFFER_SIZE 1204
char* readLine(char* buffer){
int i = 0;
for(i; i< BUFFER_SIZE; i++){
printf("%c",buffer[i]);
if( '\n' == buffer[i]){
char* line[124];
memcpy( line, &buffer[0], i-1 );
return *line;
}
}
free(buffer);
}
int doStuffWithLine(char* line){
return 1;
}
int main(int argc, char *argv[])
{
ssize_t aux1;
char *buffer = malloc(sizeof(char)*BUFFER_SIZE);
char *line = malloc(sizeof(char)*BUFFER_SIZE);
while((read(STDIN_FILENO, buffer, BUFFER_SIZE))>0){
line = readLine(buffer);
doStuffWithLine(line);
printf("%s", line);
}
return 0;
}
这是输入文件内容:
lol1
lol2
lol3
这是我的程序的输出:
lol1
Segmentation fault (core dumped)
我想知道如何阅读第 2 行和第 3 行,解决它并解释一下我做错了什么,因为我不明白这个问题。
提前谢谢你。
【问题讨论】:
-
而不是函数
readLine()中的char* line[124];,一个指针数组,我怀疑你的意思是char line[124];但是因为这是一个局部变量,你不能返回它的地址并且期望是能够访问它。您需要在main()中创建与BUFFER_SIZE一样大的第二个缓冲区,并将该缓冲区添加到readline()的参数列表中,以便在您调用函数doStuffWithLine()时该缓冲区将存在并且足够大。 -
你在
readLine的末尾释放了buffer -
在
readline()你free(buffer),但在下一次迭代中你再次使用缓冲区,就好像它仍然被分配一样。 -
当您输入
read()文本时,您没有将 NUL 终止添加到buffer的末尾。您需要跟踪来自read的返回值以了解多少读入buffer -
char* line[124]被声明为readLine本地,并且它的存储在返回时变得无效。在readLine中分配存储空间并返回一个指向分配块的指针,或者传递一个额外的参数为line提供所需的存储空间。