gpt4 book ai didi

c - inet_ntoa 的奇怪 printf 行为

转载 作者:行者123 更新时间:2023-12-04 12:35:13 26 4
gpt4 key购买 nike

#include <sys/socket.h>
#include <err.h>
#include <stdio.h>
#include <arpa/inet.h>
#include <netinet/in.h>
int main(int argc, char **argv) {

struct sockaddr_in X = {0};
X.sin_family = AF_INET;
X.sin_addr.s_addr = inet_addr("127.0.0.1");
X.sin_port = htons(8080);

struct sockaddr_in Y = {0};
Y.sin_family = AF_INET;
Y.sin_addr.s_addr = inet_addr("212.43.159.20");
Y.sin_port = htons(80);

printf("X:Y %s:%s\n", inet_ntoa(X.sin_addr), inet_ntoa(Y.sin_addr));
printf("X %s\n", inet_ntoa(X.sin_addr));
printf("Y %s\n", inet_ntoa(Y.sin_addr));

return 0;
}

为什么首先 pritnf 打印相同的 IP 两次而不是给出的内容?
第二个和第三个好像没问题。
似乎发生在 linux gcc/clang 和 freebsd clang 上,这是已知的吗?

最佳答案

来自 inet_ntoa 的手册页:

The inet_ntoa() function converts the Internet host address in given in network byte order to a string in standard numbers-and-dots notation. The string is returned in a statically allocated buffer, which subsequent calls will overwrite.



inet_ntoa使用静态缓冲区作为其输出,并且因为您在一次函数调用中调用它两次, printf传递了相同指针的两个副本。它包含最后完成的调用的内容。

您需要将打印拆分为两个单独的调用,就像您在以下几行中所做的那样。

关于c - inet_ntoa 的奇怪 printf 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33593824/

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