gpt4 book ai didi

c - 为什么我的 write 函数打印一个字符串(到 stdout)将随机字符附加到输出?

转载 作者:行者123 更新时间:2023-12-02 06:54:12 25 4
gpt4 key购买 nike

我正在为 Holberton School 做一个练习。这是我的 3-hello_write 代码:

#include <unistd.h>

int main(void)
{
write(1, "Hello, C\n", 1000);
return (0);
}

这是 gcc -Wall 3-hello_write.c && ./a.out 的输出:

$ gcc -Wall 3-hello_write.c && ./a.out
Hello, C
@44v4
zRx
?HQc??h?i??i?? $

当我想要的输出只是:

$ gcc -Wall 3-hello_write.c && ./a.out
Hello, C
$

我是 C 语言的初学者,所以我引用了这篇文档来了解 write 函数的语法。 http://codewiki.wikidot.com/c:system-calls:write

是否可以提供一些上下文来说明为什么它可能会在我的字符串之后打印额外的字符?

最佳答案

找出错误的最好方法是查看 documentation write 函数,并检查每个参数控制的内容:

ssize_t write(int fd, const void *buf, size_t count);

您正在为文件描述符传递 1(很好),一个字符串文字,它是指向 buf 的 C 字符串的指针(也很好),以及一个要写入的字符数。

请注意,write 不会在到达字符串标记的末尾时停止(即 '\0' 在字符串的末尾).这就是为什么您会在打印额外字符时出现未定义行为的原因。

传递正确的长度可以解决这个问题:

write(1, "Hello, C\n", 9);

不幸的是,这段代码很脆弱,因为改变字符串文字需要更新它的长度。更好的方法是使 "Hello, C\n" 成为常量,并使用 strlen:

const char *str = "Hello, C\n";
write(1, str, strlen(str));

关于c - 为什么我的 write 函数打印一个字符串(到 stdout)将随机字符附加到输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35121918/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com