gpt4 book ai didi

c - 结构返回字符数组打印两次值

转载 作者:太空宇宙 更新时间:2023-11-04 11:11:12 24 4
gpt4 key购买 nike

这是一个简单的程序,其中函数 abc 返回一个数组。但是输出是

Thanks
abcdefThanks

为什么会这样?我希望Thanks 只打印一次。此外,我需要将 a 的大小取为 6。在这个程序中,这无关紧要,但我在需要的地方进行原始套接字编程。 size = 6 在预定义的头文件中声明。我该如何实现?

char *abc()
{
unsigned char *ch;
unsigned char a[7],c[6];
strncpy(a,"Thanks",strlen("Thanks"));
strncpy(c,"abcdef",strlen("abcdef"));
ch=malloc(50);
memset(ch,0,50);
memcpy(ch,&a,strlen(a));
memcpy(ch+strlen(a)+1,&c,strlen(c));
return ch;
}
int main()
{
char *a;
a=abc();
printf("\n%s\n",a);
printf("\n%s\n",(a+7));
fflush(stdout);
return 0;
}

谢谢 :)

最佳答案

调用 strlen(a) 不会在您认为应该停止的地方停止,因为没有零终止符并且垃圾内存会破坏您的结果。 strlen(string) 不包括零终止符的计数

您应该执行以下操作(查看评论)

char *abc()
{
char *ch;
char a[7],c[7];
strncpy(a,"Thanks",strlen("Thanks")); // Watch out, strlen(string) doesn't include null terminator
a[6] = '\0'; // Prevent garbage from uninitialized memory to pester your ch and strlen(a)
strncpy(c,"abcdef",strlen("abcdef"));
c[6] = '\0';
ch=malloc(50);
memset(ch,0,50);
memcpy(ch,&a,strlen(a));
memcpy(ch+strlen(a),&c,strlen(c)); // No -1 because you want to cut the terminator off
return ch;
}
int main()
{
char *a;
a=abc();
printf("\n%s\n",a);
printf("\n%s\n",(a+7));
fflush(stdout);
return 0;
}

上面的代码是用 C++ 编译的,但经过一些调整后应该差不多。

这是一个类似内存的转储,其中 # 表示垃圾

char *abc()
{
char *ch;
char a[7],c[7];
strncpy(a,"Thanks",strlen("Thanks")); // Watch out, strlen(string) doesn't include null terminator
// a = "Thanks##################################.."
a[6] = '\0'; // Prevent garbage from uninitialized memory to pester your ch and strlen(a)
// a = "Thanks\0############################"
strncpy(c,"abcdef",strlen("abcdef"));
// c = "abcdef############################"
c[6] = '\0';
// c = "abcdef\0############################"
ch=malloc(50);
// ch = "###############################"
memset(ch,0,50);
// ch = "000000000000000000000000000000"
memcpy(ch,&a,strlen(a));
// ch = "Thanks000000000000000000000000"
memcpy(ch+strlen(a),&c,strlen(c)); // No -1 because you want to cut the terminator off
// ch = "Thanksabcdef00000000000000000"
return ch;
}

关于c - 结构返回字符数组打印两次值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23076831/

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