我正在尝试为strncpy
我在手册中阅读了它的工作原理,并制定了我的算法
然后我做了一个测试,看看我的ft_strncpy
和真正的strncpy
之间是否有任何区别
#include <string.h>
#include <stdio.h>
char *ft_strncpy(char *dest, char *src, unsigned int n)
{
unsigned int i;
i = 0;
while (i < n && src[i] != ' ')
{
dest[i] = src[i];
i++;
}
while (i < n)
{
dest[i] = ' ';
i++;
}
return (dest);
}
int main(void)
{
char src1[] = "123456789q00000";
char dest1[] = "zzz";
printf("my outputn");
printf("src1: %sn", src1);
ft_strncpy(dest1, src1, 8);
printf("dest1: %sn", dest1);
printf("nhow it should ben");
char src2[] = "123456789q00000";
char dest2[] = "zzz";
printf("src2: %sn", src2);
strncpy(dest2, src2, 8);
printf("dest2: %sn", dest2);
}
假定CCD_ 4部分是实际CCD_但我有奇怪的输出,就像我提供的代码中一样
我得到了这个错误
*** buffer overflow detected ***: terminated
signal: aborted (core dumped)
我从手册中了解到strncpy
将n
的第一个字符从*src
复制到*dest
char src2[] = "123456789q00000";
char dest2[] = "zzz";
printf("src2: %sn", src2);
strncpy(dest2, src2, 10);
printf("dest2: %sn", dest2);
应输出:123456789q
作为dest
的值我是不是错过了smth?
c中的数组不是动态的,所以
我不能只用字符串初始化它,然后尝试将其更改为更大的
,这将导致未定义的行为
此外,还有一个角落的情况,它可能不会添加终止的null字符,所以我不能用printf
打印它,因为它不再是字符串,而是数组
结论:修改字符串时要更加谨慎
(在@Someprogrammerdude和@n.1.8e9-我的份额在哪里m的帮助下回答(
strncpy(dest2, src2, 10);
有未定义的行为,因为它将修改以dest2[0]
开头的10个字节,而dest2
只有4个字节长。
出于同样的原因,您在ft_strncpy(dest1, src1, 8);
中遇到了同样的问题。
使用具有未定义行为的代码进行的测试无法得出任何结论。必须首先更正代码。
除了长度参数的类型unsigned int
应该是size_t
之外,您为ft_strncpy()
编写的代码似乎是正确的。使用unsigned int
可能是你学校项目的一个要求,但也是一个有争议的要求,还有其他适得其反的要求,比如禁止for
循环和强制在return
值周围使用括号。
这是一个修改版本:
#include <string.h>
#include <stdio.h>
char *ft_strncpy(char *dest, char *src, unsigned int n)
{
unsigned int i;
i = 0;
while (i < n && src[i] != ' ')
{
dest[i] = src[i];
i++;
}
while (i < n)
{
dest[i] = ' ';
i++;
}
return (dest);
}
void dump(const char *prefix, const char *p, size_t size)
{
size_t i;
printf("%s: %s [", prefix, p);
i = 0;
while (i < size) {
printf(" %.2X", (unsigned char)p[i]);
i++;
}
printf(" ]n");
}
int main(void)
{
char src1[] = "zzz";
char dest1[] = "123456789q00000";
printf("my outputn");
printf("src1: %sn", src1);
ft_strncpy(dest1, src1, 8);
dump("dest1: ", dest1, sizeof dest1);
printf("nhow it should ben");
char src2[] = "zzz";
char dest2[] = "123456789q00000";
printf("src2: %sn", src2);
strncpy(dest2, src2, 8);
dump("dest1: ", dest1, sizeof dest1);
return 0;
}
输出:
my output
src1: zzz
dest1: : zzz [ 7A 7A 7A 00 00 00 00 00 39 71 30 30 30 30 30 00 ]
how it should be
src2: zzz
dest1: : zzz [ 7A 7A 7A 00 00 00 00 00 39 71 30 30 30 30 30 00 ]