空字符串输入和读取的系统调用导致分段错误

时间:2019-01-24 12:12:15

标签: c operating-system segmentation-fault system

我正在尝试使用read(int fd, void *buf, size_t count);从STDIN中读取输入 输入为EOF时应如何处理案件?还是空字符串?目前,我遇到了细分错误

这是代码段:

int rd;
char buf[100];
rd = read(0, buf, 99);
buf[strcspn(buffer, "\n")] = 0;

谢谢

1 个答案:

答案 0 :(得分:4)

与所有其他字符串函数一样,strcspn依赖以空字符开头的字符串。

如果输入不包含换行符,则strcspn函数将因缺少终止符而超出范围。

您还需要处理read返回文件末尾或错误的情况,这由它分别返回0-1来表示。就像指定的in the manual(您应该真正阅读!)一样。

仅在read成功之后,在read调用之后直接在适当位置添加终止符:

rd = read(STDIN_FILENO, buf, sizeof buf - 1);  // sizeof buf relies on buf being an actual array and not a pointer
if (rd == -1)
{
    // Error, handle it
}
else if (rd == 0)
{
    // End of file, handle it
}
else
{
    // Read something

    buf[rd] = '\0';  // Terminate string

    // Terminate a newline
    buf[strcspn(buf, "\n")] = '\0';  // Truncate at newline (if any)
}