gpt4 book ai didi

c++ - printf 和多个字符串的不良行为

转载 作者:搜寻专家 更新时间:2023-10-31 00:01:28 26 4
gpt4 key购买 nike

当我对两个字符串使用 printf/printf_s 时,我得到两个 %s 变量的相同输出。

IN_ADDR oldIP;
oldIP.S_un.S_addr = iptable[j]->ipAddress;
IN_ADDR newIP;
newIP.S_un.S_addr = adapterTbl->table[i].dwAddr;
printf_s("index %d old: %s new: %s",
adapterTbl->table[i].dwIndex, inet_ntoa(oldIP),
inet_ntoa(newIP));

输出是:

index 11 old: 192.168.1.1 new: 192.168.1.1

现在,我已经通过在 print 语句之前中断来检查 oldip 和 newip 的值是否不同,我还尝试制作以下函数并在 print 语句中使用它(而不是 inet_ntoa):

char *convertIP (DWORD ip)  
{
IN_ADDR *addr = new IN_ADDR;
memset(addr, 0, sizeof(IN_ADDR));
addr->S_un.S_addr = (u_long) ip;
return inet_ntoa(*addr);
}

输出为:

192.168.1.1
192.168.1.2
index 11 old: 192.168.1.1 new: 192.168.1.1

为什么我会看到这种行为,我该如何解决?
谢谢:)

最佳答案

inet_ntoa 重新调整:

a statically allocated buffer, which subsequent calls overwrite

(这是来自 Linux 联机帮助页。)

你不能在一个函数中使用它两次,只有第二次调用的输出是可见的(而且你不知道两次调用中的哪一次是第二次 - 函数参数的评估顺序是未指定)。

执行两个单独的 printf,或将 inet_ntoa 的输出复制到本地缓冲区并输出它们。

来自 POSIX :

The return value of inet_ntoa() may point to static data that may be overwritten by subsequent calls to inet_ntoa().

所以这种行为可能不仅限于 Linux,你不能指望它覆盖静态缓冲区。

关于c++ - printf 和多个字符串的不良行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10000502/

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