C strcat/strcpy 字符指针打印不正确

C strcat/strcpy to character pointer not printing correctly

我有一个简单的程序,我正在尝试了解 strcat 和 strcpy。但是,它似乎工作得不太好。

好像复制追加就好了。但是,当我打印时,我认为它正在访问其范围之外的内存位置。

代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int sep, char ** arr)
{
    int i, size = sep;

    // Get size of whole string including white spaces
    for(i = 1; i < sep; i++)
        size += strlen(arr[i]) + 1;

    // Allocate memory
    char *ptr = malloc(size);

    for(i = 0; i < sep; i++)
    {
        // Copy first string then append
        if(i >= 1)
            strcat(ptr, arr[i]);
        else
            strcpy(ptr, arr[i+1]);

        //Replace null byte
        ptr[strlen(ptr)] = ' ';
    }

    // Add nullbyte to end
    ptr[strlen(ptr) + 1] = '[=11=]';

    // Print whole string
    printf("\n%s\n\n", ptr);

    return 0;
}

如果我传递这个字符串:O_O hi o noe0x1828GFF2 32 32 32 3 23 2 3,它会打印:

O_O O_O hi o noe0x1828GFF2 ??32 ??t?32 ?̐?32 3 23 2 3

如您所见,它打印了第一个字符串直到空格两次,以及许多甚至不在字符串中的字符。

我在这里做错了什么?

编辑:找出开头的双字符串。只需将 +1 添加到 strcat(ptr, arr[i]); 中的 arr[i]。但是,它仍然会打印其中不存在的字符。

如果我去掉这一行:ptr[strlen(ptr)] = ' ',奇怪的字符就不存在了,但它也会留下空格。

在行 ptr[strlen(ptr)] = ' '; 中,您删除了字符串末尾的终止 NULL 字符,干扰了对 strlen()strcat().

的后续调用

尝试用保存终止 NULL 的代码替换:

ptr[strlen(ptr)+1] = '[=10=]';
ptr[strlen(ptr)] = ' ';

或不调用 strlen() 两次的更优化版本:

int len = strlen(ptr);
ptr[len] = ' ';
ptr[len+1] = '[=11=]';