0

我想用来fgets()简单地读取一行并去除换行符。这适用于 Windows 和 UN*X 上的所有情况吗?

fgets(buf, sizeof buf, stdin);
strtok(buf, "\r\n");

请不要推荐非标准的东西,比如 GNU 的 getline()。提前致谢!

4

3 回答 3

4

不,如果您想要跨平台,请正确执行:

fgets (buf, sizeof (buf), stdin);
if (strlen (buf) > 0)
    if (buf[strlen (buf) - 1] == '\n')
        buf[strlen (buf) - 1] = '\0';

在 UNIX(例如)上读取 Windows 创建的文件时,您可能会遇到问题,但这将达到其预期目的,即修改标准输入。

如果您担心多次调用strlen

fgets (buf, sizeof (buf), stdin);
{
    size_t len = strlen (buf);
    if (len > 0)
        if (buf[len - 1] == '\n')
            buf[len - 1] = '\0';
}

顺便说一句,如果您正在寻找一个强大的行输入解决方案,它可以执行换行删除、缓冲区溢出检测、多余的行清理并且只使用标准 C,您应该看看这个答案

于 2013-03-15T04:10:34.117 回答
2

不,换行符的内部(解释)表示总是'\n'。所以:

 strtok(buf, "\n");

通常,需要以文本模式打开文件才能自动进行换行转换:

 text = fopen("text", "r"); // Conversion works
 binary = fopen("binary", "rb"); // Won't work
于 2013-03-15T04:21:31.687 回答
0

多谢你们。最终编写了这个包装器:

void
getstr(char *s, size_t n)
{
    int c;

    if (fgets(s, n, stdin) != NULL) {
        if (s[strlen(s) - 1] == '\n')
            s[strlen(s) - 1] = '\0';
        else
            while ((c = getchar()) != EOF && c != '\n')
               ;
    }
}
于 2013-03-15T06:41:53.297 回答