gpt4 book ai didi

C - 将两个字符数组交织在一起时出现异常结果

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

我正在开展一个项目,该项目需要将两个字符串“交织”在一起,以便它们交替使用每个字符。示例:“Apple”和“BEAR”将变为“ABpEpAlRe”

这是我当前的功能:

void printMessage(char name[], char num[])
{
char eticket[(sizeof(name)/sizeof(char))+((sizeof(num))/sizeof(char))] = ""; //make array with enough space for both strings
int i;
for(i=0;i<(sizeof(eticket)/sizeof(char));i++)
{
char tmp[1] ={name[i]}; // i have to change the char name[i] and num[i] to its own char array so i can use it in strcat
char tmp2[1] ={num[i]};
if(i<(sizeof(name)/sizeof(char))-1) //if name string is finished, don't concatenate
{
strcpy(eticket,strcat(eticket, tmp));
}
if(i<(sizeof(num)/sizeof(char))-1) //if num string is finished, don't concatenate
{
strcpy(eticket,strcat(eticket, tmp2));
}
}

printf("Your name is %s and your flight number is %s.\nYour e-ticket is: %s.\n\n", name, num, eticket);
}

其中 eticket 是最后一个字符串。

结果:

Your name is Connor and your flight number is MIA1050.
Your e-ticket is: CMMoIInAAn11o00r550.

*** stack smashing detected ***: ./a.out terminated
Aborted

我知道堆栈粉碎意味着缓冲区溢出,但更让我担心的是,出于某种我无法弄清楚的原因,num[] 数组的字符在最终字符串中加倍了。而不是“CMMoII ...”,它应该是“CMoI ...”这可能是缓冲区溢出的副作用吗?

提前致谢。

最佳答案

函数定义:

void printMessage(char name[], char num[]) { ... }

相同
void printMessage(char* name, char* num) { ... }

在函数中,sizeof(name) 等于一个指针的大小。它不会评估字符串的长度。

您需要使用 strlen 而不是 sizeof。当您使用strlen时,您需要为终止空字符添加一个额外的字符。

// eticket is now a VLA.
// Can't use ... = "";
char eticket[strlen(name)+strlen(num)+1];

您还需要更改其他使用 sizeof 的代码行。

关于C - 将两个字符数组交织在一起时出现异常结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39856271/

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