重新创建 strncpy()

问题描述 投票:0回答:1

我有一个作业,必须在没有任何库的情况下从 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$
c string while-loop char
1个回答
0
投票

这里有功能:

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

使用正确的尺寸类型。

© www.soinside.com 2019 - 2024. All rights reserved.