C串联字符串不起作用

时间:2018-03-24 15:48:37

标签: c string algorithm concatenation

int main(int argc, char** argv) {
    char data[1024];
    data[0] = '\0';
    for(int i = 1; i < argc; i++){
        strcpy(data+strlen(data), (argv[i] + 1));
    }
    strcpy(data+strlen(data), data+strlen(data)/2);
    printf(data);

    return 0;
}

正如您所见,这是我的代码。我要做的是:从每个参数中删除第一个字母,将它们连接到data,然后在循环后取出结果字符串的一半并再次连接,然后打印它。例如:

使用参数helloworldyes调用程序时应打印: elloorldesrldes

直到strcpy(data+strlen(data), data+strlen(data)/2);才有效。在这里,我尝试取一半的字符串(data)并将其连接到同一个字符串的末尾。当我离开那部分时,我得到了结果elloorldes但是当我把它放进去时,我得到了错误RUN FAILED (exit value -1.073.741.819, total time: 4s),而不是给我预期的结果,但我不确定为什么&# 39;是的。

1 个答案:

答案 0 :(得分:4)

你不能这样做

strcpy(data+strlen(data), data+strlen(data)/2);

因为strcpy无法处理内存重叠的情况。

  

man strcpy

char *strcpy(char *dest, const char *src);
     

<强>描述

     

strcpy()函数复制src指向的字符串,包括终止空字节('\0'),   到dest指向的缓冲区。 字符串可能不重叠,目标字符串dest必须足够大才能接收副本。

您需要使用memmove来处理内存重叠:

size_t oldsize = strlen(data);
size_t size = oldsize/2;

memmove(data+oldsize, data+size, size);
data[oldsize + size] = 0;

另外,请勿使用用户提供的内容printf(data)。让我们说吧 传递的参数是helloworld%d,然后data将包含%d和。{ printf会产生未定义的行为,因为缺少参数。

你应该这样做:

printf("%s\n", data);

puts(data);
相关问题