[英]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
,然后在循环后取一半结果字符串,然后再次合并,然后打印出来。 例:
使用参数hello
, world
和yes
调用程序应打印: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)
处理。 假设传递的参数是hello
, world%d
,那么data
将包含%d
而printf
将产生未定义的行为,因为缺少参数。
你应该做这个:
printf("%s\n", data);
要么
puts(data);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.