【发布时间】:2021-05-20 20:58:14
【问题描述】:
我正在尝试自己实现strcpy 函数。原始的strcpy 是string.h 库的一部分。
char *strcpy(char *dest, const char *src)
{
assert(dest != NULL && src != NULL);
char *temp = dest;
while (*src)
{
*dest = *src;
src++;
dest++;
}
return temp;
}
void strcpyTest()
{
char source[20] = "aaaaaa";
char dest1[20] = "bbbbbbbbb";
char desta[10]="abcd";
puts(dest1); // bbbbbbbbb
strcpy(dest1, source);
puts(dest1); // aaaaaa
strcpy(desta, source);
puts(desta); // aaaaaa
strcpy(desta, dest1);
puts(desta); // aaaaaa
strcpy(dest1, desta);
puts(dest1); // aaaaaa
strcpy(source, desta);
puts(source); // aaaaaa
}
如您所见,即使是第一次调用dest 比src 更长的函数也会给出正确的结果,尽管按照逻辑,它应该给出
aaaaaabb 而不是aaaaaa:
char source[20] = "aaaaaa";
char dest1[20] = "bbbbbbbbb";
strcpy(dest1, source);
puts(dest1);
/** aaaaaa **/
为什么我的函数有效?我猜我必须在while (*src)` 退出后手动在*dest* 末尾添加/0 字符。
我的意思是这个while (*src) 的全部意义在于当它到达*src* 的末尾时退出,这是/0 字符串中的最后一个字符。
因此,我想我必须自己将这个字符添加到*dest*,但代码会以某种方式工作并复制字符串,而无需手动添加/0。
-
所以我的问题是它为什么以及如何仍然有效?
-
当我创建一个新数组时,假设
int *arr或char *arr,共 10 个,即char arr[10]或int arr[10],并且我只初始化前 2 个索引,其余部分中的值会发生什么情况索引?它们会填充零或垃圾值还是什么?
也许我的代码有效,因为它填充了零,这就是 while 循环停止的原因?
【问题讨论】:
-
初始化数组时,任何未显式设置的元素都将被设置为与静态变量相同的方式,也就是说未显式初始化的元素将被隐式初始化为0。
-
它完全是偶然的。您的目标数组恰好有
\0在恰好给您“正确”结果的地方。 -
@NoobCoder 我希望它能打印出
aaaaaabb。我说的对吗? -
抱歉,无法重现。仔细检查它。 ideone.com/xHqWWz - 这是按照我的预期打印的(虽然算错了
bs) -
C 标准明确禁止用您自己的同名函数替换库函数。所以编译器可以使用它自己的
strcpy,即使你提供了一个不同的。尝试更改函数的名称,或者至少在函数的开头加上printf以确保它实际上被调用了。
标签: c while-loop c-strings strcpy function-definition