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)
,而不是给我预期的结果,但我不确定为什么&# 39;是的。
答案 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)
。让我们说吧
传递的参数是hello
,world%d
,然后data
将包含%d
和。{
printf
会产生未定义的行为,因为缺少参数。
你应该这样做:
printf("%s\n", data);
或
puts(data);