【发布时间】:2015-06-08 15:16:24
【问题描述】:
当我想要进行手动字符串复制时,我发现以下代码段令人困惑。
int strincmp(char *s1) {
int l1 = strlen(s1)+1;
char *s1_copy = malloc(sizeof(char) * l1);
while(*s1_copy++=*s1++);
printf("s1_copy = %s , s1 = %s \n",s1_copy,s1);
return 0;
}
输出令人困惑,因为我希望它输出一个复制的字符串。但具体如下:
s1_copy = , s1 =
当我替换“while(*s1_copy++=*s1++);”时使用以下幼稚方式声明(将 s1_copy 和 s1 视为数组而不是 ptrs)
int i=0;
while( s1[i] != '\0'){
s1_copy[i] = s1[i];
i++;
}
s1_copy[i] = '\0';
输出是我所期望的。
s1_copy = TenaLynetta , s1 = TenaLynetta
这让我很困惑,为什么第一种方法不起作用。希望这是一个有意义的问题。
【问题讨论】:
-
复制命令的奇怪名称?
-
您自己添加了 printf 吗?它显然不会做任何有用的事情,因为指针已经超出了它们各自字符串的末端。将 printf 移出函数或保留原始指针的副本。
-
@envy_intelligence:指针实际上已经(后)递增到每个字符串的终止
\0之外的一个字符,因此它们都指向未定义的位置 - 然后打印的内容可以是从字面上看任何东西,因为它是未定义的行为。 -
谢谢你们。这是一种天真的误解。问题是我移动了指针,当我想打印指针时,指针不再位于开始位置。
-
快捷方式:而不是
while(*s1_copy++=*s1++);,使用memcpy(s1_copy, s1, ll);