【发布时间】:2019-07-13 05:24:53
【问题描述】:
我必须为赋值重写一个模仿 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);
}
【问题讨论】:
-
当他们基本上做同样的事情时 - 不正确的假设。见Null-terminated strings。
-
试试这个:
char x[] = "one\0\0\0two\0three"; printf("%s %s %s\n", x, x+6, x+10);(ideone) -
你不必返回你写入的缓冲区。你可以有一个关于它是否成功的返回。
-
“完美运行” --> 没有。