strncpy上源字符串长于目标数组的问题

问题描述 投票:-2回答:3

我试图考虑如何制作函数strncpy,但遇到了这个问题。

    char src[] = "123456789A";
    char dest[10];
    int n = 10;
    printf("strncpy:%s\n", strncpy(dest, src, n));

输出

strncpy:123456789A123456789A

发生了什么事?

c buffer c-strings strncpy
3个回答
1
投票

快速答案:strncpy 不是您的朋友!

strncpynot strcpy更安全版本,它将从n复制最多src个字符,如果src较短,则将目标填充为空个字节,总计n个字符。

如果源字符串包含n个或更多字符,则目标数组将不以null终止,传递给printf("%s",的将具有未定义的行为printf将继续读取和打印字节dest结束后从内存中删除,直到找到空字节或直到此未定义的行为引起其他不可预测的副作用为止。]

strncpy的语义是违反直觉的,并且容易出错,请避免使用此功能。详见本文:https://randomascii.wordpress.com/2013/04/03/stop-using-strncpy-already/


1
投票

正如其他人所说的,如果目标大小与字符串长度相同,则strncpy将不包含终止null。为了给您一个实用的答案,我通常只需要使用sizeof从目标大小中减去一个即可得到目标大小,包括终止符的空间:


1
投票

数组dest不包含字符串,因为没有足够的空间来容纳复制的源字符串的终止零'\0'

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