繁体   English   中英

C连接字符串不起作用

[英]C concatenating strings won't work

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)错误RUN FAILED (exit value -1.073.741.819, total time: 4s) ,但是我没有确定为什么会这样。

你不可以做这个

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

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

人strcpy

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

描述

strcpy()函数将src指向的字符串(包括终止的空字节( '\\0'strcpy()复制到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将包含%dprintf将产生未定义的行为,因为缺少参数。

你应该做这个:

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

要么

puts(data);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM