c-strncpy产生奇怪的输出



我正在尝试为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)

我从手册中了解到strncpyn的第一个字符从*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 ]

相关内容

  • 没有找到相关文章

最新更新