我正在进行一项任务,其中一部分是使用系统函数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()
一起使用,我只是修改它只是因为它只是用{{1 }}。它可能非常混乱,为此我道歉,但它必须以这种方式完成。我知道问题就在这里,因为它永远不会到read()
之前的printf
。
如果您需要,请printSTDLines
:
printSTDLines
答案 0 :(得分:1)
您正在使用strlen(lines)
,但绝不会nul
终止它。 strlen()
函数希望找到一个'\0'
字节来告诉&#34; 字符串&#34;是的,您不会将该字节添加到任何数组并调用未定义的行为,这可能导致分段错误。
另外,这个
for(lineCount = readSize; lineCount < sizeof(lines); lineCount++)
似乎错了,sizeof
运算符不适用于动态分配的数组,在这种情况下lines
是一个指针,这意味着sizeof
给你的大小一个指针,绝不是数组的长度,这显然是你想要的。
要在printSTDLine()
内使用数组的长度,您需要将其作为参数传递。