我有一个作业,必须在没有任何库的情况下从 C 重新创建 strlcpy 函数。我写了代码并提交了,但是被标记为错误。你知道为什么吗?
我附上了收到的差异文本,它代表了为什么我的问题是错误的(对我来说这看起来像是胡言乱语),以及我的两个同事提出的被标记为正确的解决方案。你能说出这两个函数何时可能有不同的输出吗?
除了ChatGPT 3.5和4.0以及ClaudeAI之外,我还问了很多同行。人工智能最初表示这些功能不同,但都无法提供任何会导致不同结果的输入。 我的代码:
char *ft_strncpy(char *dest, char *src, unsigned int n)
{
unsigned int i;
i = 0;
while (i < n)
{
if (src[i])
dest[i] = src[i];
else
dest[i] = '\0';
i++;
}
return (dest);
}
同行代码:
{
unsigned int i;
i = 0;
while (i < n && src[i] !='\0')
{
dest[i] = src[i];
i++;
}
while (i < n)
{
dest[i] = '\0';
i++;
}
return (dest);
}
我将在评论中列出差异文本,这样它就不会占用太多空间
$> diff -U 3 user_output_test1 test1.output | cat -e --- user_output_test1 2024-03-20 15:16:50.490408519 +0000$ +++ test1.output 2024-03-20 15:16:50.470408242 +0000$ @@ -2,69 +2,69 @@$ 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d6b4c6156524a4e4f64505a6d62724d$ 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004d6b4c61524256466c575441675a444f$
这里有功能:
char *ft_strncpy(char *dest, const char *src, size_t size)
{
size_t s = size;
char *wrk = dest;
if(dest && src && size)
while(s--)
if(!(*wrk++ = *src++)) break;
return dest;
}
char *ft_strlcpy(char *dest, const char *src, size_t size)
{
size_t s = size;
char *wrk = dest;
if(dest && src && size)
while(--s)
if(!(*wrk++ = *src++)) goto function_return;
*wrk = 0;
function_return:
return dest;
}
void printstr(const char *str, const size_t size)
{
for(size_t i = 0; i < size; i++)
{
printf("%c[%02hhx] ", isprint(str[i]) ? str[i] : '.', str[i]);
}
printf("\n");
}
int main()
{
char a[5];
ft_strncpy(a, "abcdefgd", sizeof(a));
printstr(a, sizeof(a));
ft_strlcpy(a, "abcdefgd", sizeof(a));
printstr(a, sizeof(a));
}
https://godbolt.org/z/c6ozvMzcT
使用正确的尺寸类型。