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

标签 c arrays string buffer concatenation

我正在开展一个项目,该项目需要将两个字符串“交织”在一起,以便它们交替使用每个字符。 示例:“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/

相关文章:

java - Swig 如何定义一个类型映射,将 C 类型定义的 boolean 值转换为 java boolean 值

javascript - 在javascript中的字典数组中搜索一个id

Java - 提取后缀和前缀中间的字符串

jQuery:将字符串添加到 URL

c++ - 为嵌套结构指针分配内存

c - 这个链表代码是一个好习惯吗?

iphone - 花栗鼠物理学 : Velocity question

java - 有没有办法重载 JSONArray 使其表现得像循环中的常规列表?

复杂的字符串和数组声明

ruby - 从 Ruby 中的 String 对象获取括号之间的内容