0

测试.c

int main() {
    int fd = open("/test/aaa",O_RDONLY);
    char * str;
    int len;
    str = (char*)malloc(sizeof(char));
    len = read(fd,str,100);
    close(fd);
    printf("%s\n",str);
    free(str);
    str = NULL;
    return 0;
}

输出是这样的:

$echo 300 > /test/aaa
$gcc test.c -o test
$./test
300

$

为什么这里有换行符输出?有没有安全的方法来骑它?还是我以错误的方式使用 read() ?谢谢!

4

6 回答 6

4

因为文件中有一个换行符,如果您使用以下内容进行转储,您会看到它:

od -xcb /test/aaa

它在文件中的原因是因为你把它放在那里:默认行为echo是写你给它的东西加上换行符。

如果您不想要换行符,请使用:

echo -n 300 >/test/aaa

此外,您没有分配足够的空间malloc来存储除单个字符以外的任何内容,您可能想尝试:

str = malloc (100);

您还会注意到我没有将返回值转换为malloc- 这是 C 中的一个坏习惯,它完全能够将void *返回的值隐式转换为任何其他指针。如果您显式转换,它可以隐藏某些细微的错误。

它也是一个在 Csizeof(char)始终为1 的给定值,因此您无需将其乘以任何值。


老实说,如果我想要基于行的文件输入,那read不是我的首选。有更好的选择,比如fgets做那种事情。

于 2013-05-15T09:22:06.837 回答
1

您读入的文件的末尾可能已经有一个换行符。请记住,read尽可能多地阅读。

当您使用 时printf,您要求添加另一个换行符。

这就是为什么你得到两个换行符。

编辑:您还会在程序中的多个位置导致未定义的行为。

您正在malloc为 1 个字符设置空间,但您正在将 100 个字节存储到其中。

此外,您不是以空值终止字符串,这意味着printf将读取字符,直到遇到空字节或崩溃。它甚至可以一直读取字符到宇宙的尽头。

于 2013-05-15T09:20:21.993 回答
1

您的代码中有未定义的行为

str = (char*)malloc(sizeof(char));

在这里你只分配一个字节!然后您继续将 100 个字节读入该内存区域。并且您将分配的内存视为字符串,但您没有正确终止字符串,从而导致另一种可能的未定义行为情况。而且您甚至不检查您的readormalloc呼叫中可能出现的错误。

顺便说一句,sizeof(char) always1,你永远不应该返回malloc.

于 2013-05-15T09:22:08.930 回答
0

因为默认情况下echo会在行尾添加换行符。这就是为什么您的文件以换行符结尾的原因。

您可以使用 禁用此功能echo -n 300 > /test/aaa

于 2013-05-15T09:20:52.483 回答
0

这是因为你把它放在那里:

printf("%s\n",str);

也许您的意思是:

printf("%s",str);

现在你只会得到文件包含的内容。当然,该文件的末尾可能包含自己的换行符。

于 2013-05-15T09:21:07.763 回答
0
$echo -n 300 > /test/aaa

-n 将避免新行

于 2013-05-15T09:23:55.067 回答