和strcpy,strcat,strcmp函数对应的是strncpy,strncat,strncmp函数
8.strncpy函数
*简单使用
翻译:
函数
strncpy
char * strncpy ( char * destination, const char * source, size_t num );
从字符串中复制一些字符
复制源(source )字符串的前num 个字符到目标(destination )字符串中.如果在复制num个字符之前遇到了源字符串的末尾(由\0指示),那么之后会有由\0来填充直到复制完所有的num个字符.
如果源字符串的字符个数大于num,则不会在目标字符串的末尾追加隐含的\0
因此在这种情况下,目标字符串不应该只包含\0(这样读取会溢出)
如:
cpp#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <string.h> int main() { char arr1[20] = { "Hello World!" }; char arr2[1] = {"\0"}; strncpy(arr2, arr1, 5); printf("%s", arr2); return 0; }
目标和源的地址不应该重叠(参见memmove,了解重叠时更安全的替代方案)
参数
目标(destination):指向目标数组(接收复制的内容)的指针
源(source):要被复制的字符串
个数(num):从源中最多需要复制的字符个数
size_t是无符号整型
返回值:
目标已返回
与strcpy相比,strncpy多了一个num参数(源中最多要拷贝的字符个数,类型为size_t
可以指定拷贝字符的个数
例如:
将arr1的前5个字符复制到arr2中,打印arr2
cpp
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[20] = { "Hello World!" };
char arr2[20] = { 0 };
strncpy(arr2, arr1, 5);
printf("%s", arr2);
return 0;
}
例如:
cpp
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[20] = { "Hello World!" };
char arr2[20] = { "xxxxxxxxxxxxxxxxxxx"};
strncpy(arr2, arr1, 15);
printf("%s", arr2);
return 0;
}
*例题
求下列代码的打印结果
cpp
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[20] = { "H\0ello World!" };
char arr2[20] = { 0 };
strncpy(arr2, arr1, 5);
printf("%s", arr2);
return 0;
}
答案速查:
分析:
上方的翻译表述
其实画红线处隐晦表明源字符串的第一个\0
9.strncat函数
*简单使用
翻译:
函数
strncat
char * strncat ( char * destination, const char * source, size_t num );
从字符串中追加字符
将源(source) 的前num个字符追加到*目标(destination)*中,再加一个\0字符
如果源 字符串的字符个数小于num个,则只复制\0之前(包含\0本身)的内容
参数
目标(destination):指向包含字符串的目标数组的指针,而且该数组空间足够大来容纳追加的字符串,包含\0
源(source):要追加的字符串
个数(num):
从源中最多需要复制的字符个数
size_t是无符号整型
返回值:
目标已返回
之前在52.【C语言】 字符函数和字符串函数(strcat函数)说过,strcat函数在使用中,特别提醒了字符串不能自己追加自己,但strncat函数可以实现
cpp
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[20] = { "Hello" };
strncat(arr1, arr1, 5);
printf("%s", arr1);
return 0;
}
*例题
求下列代码执行后arr1数组元素的情况
cpp
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[20] = { "Hello\0xxxxxxxxxxxxx" };
char arr2[20] = { " World!" };
strncat(arr1, arr2, 10);
printf("%s", arr1);
return 0;
}
答案速查:
显然并没有一直追加\0
分析:见cplusplus的翻译
10.strncmp函数
*简单使用
翻译
函数
strncmp
int strncmp ( const char * str1, const char * str2, size_t num );
比较两个字符串的长度
最多比较str1指向的字符串和str2指向的字符串的num个字符
这个函数从比较两个字符串的第一个字符开始,如果他们之间相等(ASCII码值一样),该函数会继续成对比较直到这些情况有一个先发生为止:
① 两个字符串的成对字符出现差异
② 遇到了\0
③ 两个字符串的每对字符之间都相等
参数
str1:指向需要比较的字符串
str2:指向需要比较的字符串
num:最多需要比较的字符个数
size_t是无符号整型
返回值
返回整型数字来表明两个字符串之间的关系
cpp
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[20] = { "Hello" };
char arr2[20] = { "Hela" };
int ret = strncmp(arr1, arr2, 3);
printf("%d", ret);
return 0;
}
比较前3个字符,返回0
介绍完strncpy,strncat,strncmp函数,与strcpy,strcat,strcmp函数对比发现:strncpy,strncat,strncmp函数较安全,因为有num长度的限制