经过多次试验和错误,一些外部帮助后,我必须为分配重写一个模仿 strncpy 行为的函数,这是最终代码:
15 char *ft_strncpy(char *dest, char *src, unsigned int n)
16 {
17 unsigned int i;
18 unsigned int size;
19
20 i = 0;
21 size = 0;
22 while (src[i] && i < n)
23 {
24 dest[i] = src[i];
25 i++;
26 }
27 while (i < n)
28 {
29 dest[i] = '\0';
30 i++;
31 }
32 return (dest);
33 }
它完美无缺,但我不明白这部分:
while (i < n)
{
dest[i] = '\0';
i++;
}
此时, i 的值应该是 (n - 1) 对吧?所以'\0' goes into dest[n-1]
循环结束,因为i becomes equal to n
然后函数结束。
我们留下了一个看起来像这样的字符串:
"string copied\0not copied part"
并打印为 : string copiednot copied part
。
我的问题是:
当他们基本上做同样的事情时,为什么
dest[n-1]='\0'
或者dest[n]='\0'
而不是那个while循环,string copied
而不是'字符串复制而不复制部分'返回?为什么
\0
在 while 循环之后打印出来时似乎被“忽略”,而当我使用 dest[n-1] = '\0' 时它被认为是句号?
这是我用来运行测试并尝试理解的主要/替代功能:
int main()
{
char str[] = "test de chaine";
char *str2 = "chaine de test";
ft_strncpy(str, str2, 6);
printf("%s", str);
return 0;
}
char *ft_strncpy(char *dest, char *src, unsigned int n)
{
unsigned int i;
unsigned int size;
i = 0;
size = 0;
while (src[i] && i < n)
{
dest[i] = src[i];
i++;
}
dest[n-1] = '\0';
return (dest);
}