这个问题在这里已有答案:
我正在进行一项任务,其中一部分是使用系统函数 read()
从stdin读取,然后打印最后10行,到目前为止我已经得到了这个:
int tailSTD()
{
char *lines = malloc(1);
char buffer[10];
int cmdCount = 0, buffCount, rState;
while((rState = read(STDOUT_FILENO, buffer, 10)) > 0)
{
if(rState < 0)
{
if(errno == EINTR) rState = 0;
else
{
perror("read()");
return 0;
}
}
else if (rState == 0) break;
lines = realloc(lines, strlen(lines) + strlen(buffer));
for(buffCount = 0; buffCount < strlen(buffer); buffCount++)
{
lines[cmdCount] = buffer[buffCount];
cmdCount++;
}
}
printf("do we get this far?");
printSTDLines(lines);
return 0;
}
问题是我在循环的某个地方遇到了分段错误,我不确定在哪里,这与 fgets()
一起工作,我只是修改它只是因为它只是用 read()
来完成 . 它可能非常混乱,为此我道歉,但它必须以这种方式完成 . 我知道问题出在这里,因为它永远不会到达 printSTDLines
之前的 printf
. 如果你需要,这里是 printSTDLines
:
void printSTDLines(char *lines)
{
int lineCount = strlen(lines), newLineCount = 0;
while(newLineCount < 10)
{
if(lines[lineCount] == '\n')
{
newLineCount++;
}
lineCount--;
}
int readSize = strlen(lines) - lineCount;
for(lineCount = readSize; lineCount < sizeof(lines); lineCount++)
{
write(STDOUT_FILENO, &lines[lineCount], 1);
}
}
1 回答
您正在使用
strlen(lines)
,但您永远不会nul
终止它 .strlen()
函数需要找到一个'\0'
字节来判断“字符串”的结尾位置,不要将该字节添加到任何数组中并调用未定义的行为,这可能导致分段错误 .还有,这个
似乎错了,
sizeof
运算符不适用于动态分配的数组,在这种情况下lines
是一个指针,这意味着sizeof
给你一个指针的大小,绝不是数组的长度,这显然是你想要的 .要在
printSTDLine()
中使用数组的长度,您需要将其作为参数传递 .