本篇博客继续讲解string.h中的库函数。在上一篇博客中,我介绍了strlen, strcpy, strcat, strcmp这4个字符串操作函数,本篇博客会继续介绍strncpy, strncat, strncmp这3个类似的函数。
strcpy, strcat, strcmp这3个函数是长度不受限制的字符串操作函数,而strncpy, strncat, strncmp则是对应的3个长度受限制的字符串操作函数。这个“长度受限制”应该如何理解呢?
对于strcpy, strcat, strcmp这3个函数,有一个共同的特点,操作字符串时,只看字符串的结束标志,即\0
,所以说它们是长度不受限制的。
- strcpy会一直拷贝源字符串,直到遇到源字符串结尾的
\0
。 - strcat会一直追加源字符串到目标字符串后面,直到遇到源字符串结尾的
\0
。 - strcmp在比较2个字符串时,如果一直相同,会一直向后比较,直到某一个字符串遇到了
\0
。
如果是“长度受限制”的函数,应该是:
- strncpy可以指定拷贝多少个字符。
- strncat可以指定最多追加多少个字符。
- strncmp可以指定最多比较多少个字符。
下面我一一详细介绍。
strncpy
char * strncpy ( char * destination, const char * source, size_t num );
strncpy和strcpy都是用来拷贝字符串的,但是strncpy多了第3个参数:num。num代表拷贝的字符的个数,不管源字符串长度是多少,一律拷贝num个字符过去,如果不够就用\0
补齐。
比如:
char arr1[20] = "xxxxxxxxxx";
char arr2[] = "abcde";
strncpy(arr1, arr2, 4);
会把abcd拷贝过去。strncpy(arr1, arr2, 5);
会把abcde拷贝过去,不拷贝\0
。strncpy(arr1, arr2, 6);
会把abcde和\0
都拷贝过去。strncpy(arr1, arr2, 7);
会把abcde和2个\0
拷贝过去。strncpy(arr1, arr2, 8);
会把abcde和3个\0
拷贝过去。
下面我在VS2022中分别验证这5种情况。
strncpy总结:
- strncpy会拷贝num个字符,从源字符串到目标空间。
- 如果strlen(src)<num,在把src中的字符(不包括结尾的
\0
)都拷贝到目标空间后,会补\0
,直到拷贝字符总数为num。
strncat
char * strncat ( char * destination, const char * source, size_t num );
strncat会在目标字符串后面追加源字符串,最多追加num个字符(不包括\0
),然后再追加一个\0
以保证目标空间里仍然是一个字符串。
比如:
char arr1[20] = "xxx\0xxxxxxxxxx";
char arr2[] = "abcde";
strncat(arr1, arr2, 4);
会追加abcd,再追加\0
。strncat(arr1, arr2, 5);
会追加abcde,再追加\0
。strncat(arr1, arr2, 6);
会追加abcde,再追加\0
。strncat(arr1, arr2, 7);
会追加abcde,再追加\0
。strncat(arr1, arr2, 8);
会追加abcde,再追加\0
。
下面我在VS2022中分别验证这5种情况。
strncat总结:
- strncat在完成字符串追加的同时,还可以限定最多追加的字符个数。
- strncat的第3个参数表示,最多追加几个字符过去(不包括
\0
),然后再追加一个\0
过去。
strncmp
int strncmp ( const char * str1, const char * str2, size_t num );
这个函数就很简单了,在字符串比较的基础上,最多比较num对字符。比如:
strncmp("abcdefg", "abcdq", 4);
返回0。strncmp("abcdefg", "abcdq"), 5;
返回负数。strncmp("abcd", "abcd", 10);
返回0,只要一个字符串遇到\0
就停止比较。strncmp("abcde", "abcd");
返回正数。
strncmp总结:
- 比较字符串,且最多比较num对字符。
- 如果其中一个字符串遇到
\0
,另外一个字符串如果也同时遇到\0
则2个字符串相等,如果另外一个字符串还没有遇到\0
,则提前遇到\0
的字符串更小。
总结
- strncpy的第3个参数决定了要拷贝多少个字符过去,如果不够就补
\0
。 - strncat的第3个参数决定了最多追加多少个字符过去(不包括源字符串结尾的
\0
),然后再追加一个\0
过去。 - strncmp的第3个参数决定了最多比较多少对字符,如果比较出了大小,或者其中一个字符串遇到了
\0
则比较结束。
感谢大家的阅读!