字符和字符串的库函数的使用和注意事项
- 求字符串长度 strlen
- 长度不受限制的字符串函数 strcpy-strcat-strcmp
- 长度受限制的字符串函数介绍 strncpy-strncat-strncmp
- 字符串查找 strstr-strtok
- 错误信息报告 strerror
- 字符操作
- 内存操作函数 memcpy-memmove-memset-memcmp
前言
C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串(以首元素地址的形式存储)中或者字符数组中。字符串常量适用于那些对它不做修改的字符串函数。字符串在存储上类似字符数组,所以它每一位的单个元素都是可以提取的,在存储时是把首元素的地址存进去,而不是把整个字符串存储进去。如s=“abcdefghij”,则s[1]=“b”,s[9]="j"。
函数介绍
strlen
size_t strlen ( const char * str );
- 字符串是以\0为结束标志的,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )。
- 注意函数的返回值类型为size_t,是无符号的。size_t=unsigned int;
int main()
{
const char*str1 = "abcdef";
const char*str2 = "bbb";
if(strlen(str2)-strlen(str1)>0)
{
printf("str2>str1\n");
}
else
{
printf("srt1>str2\n");
}
return 0;
}
在该程序中str2、str1的返回值都是unsigned int类型的 ,两个unsigned int相减依然还是无符号数,结果>0
strcpy
char* strcpy(char * destination, const char * source );
- 源字符串必须以 '\0' 结束,同时会将源字符串中的 '\0' 拷贝到目标空间。例如下图arr2的 b i t \0全部拷贝到arr1中。
- 目标空间必须足够大,以确保能存放源字符串。
- 头文件名 string.h
//模拟实现strcpy函数
char* my_strcpy(char* des,const char* sor)
{
//首先保证指针的有效性
assert(des !=NULL);
assert(sor !=NULL);
//拷贝sour指定的字符空间到des,包括'\0'
while (*des ++ = *sor ++)
{
;
}
return des;
}
int main()
{
char arr1[] = "abcdef";
char arr2[] = "bit";
my_strcpy(arr1,arr2);
printf("%s\n",arr1);
return 0;
}
strcat
char * strcat ( char * destination, const char * source );//追加/一个字符串
- 源字符串必须以 '\0' 结束。
- 目标空间必须有足够的大,能容纳下源字符串的内容。
- 目标空间必须可修改。头文件名 string.h
可以看到arr2在追加到arr1的时候,是从arr1的\0开始追加并替换掉,并且要保证被追加字符串的空间足够大
//模拟实现strcat函数
char* my_strcat(char* des,const char* sor)
{
//首先保证指针的有效性
assert(des !=NULL);
assert(sor !=NULL);
//找到目的字符串的\0
while (*des != '\0')
{
des++;
}
//拷贝sour指定的字符空间到des,包括'\0'
while (*des ++ = *sor ++)
{
;
}
return des;
}
int main()
{
char arr1[20] = "abcdef";
char arr2[] = "bit";
strcat(arr1,arr2);
printf("%s\n",arr1);
return 0;
}
strcmp
int strcmp ( const char * str1, const char * str2 );
- 此函数开始比较每个字符串的第一个字符,如果它们彼此相等,则继续比对,直到字符不同或到达终止空字符。
- 第一个字符串的对应字符大于第二个字符串的对应字符,则返回大于0的数字
- 第一个字符串的对应字符等于第二个字符串的对应字符,则返回0
- 第一个字符串的对应字符小于第二个字符串的对应字符,则返回小于0的数字
//模拟实现strcmp函数
int my_strcmp(const char* str1, const char* str2)
{
//首先保证指针的有效性
assert(str1 != NULL);
assert(str2 != NULL);
while (*str1 ==*str2)
{
if (*str1 == '\0')
{
return 0;
}
str1++;
str2++;
}
return (*str1-*str2);
}
int main()
{
char* arr1 = "abcdef";
char* arr2 = "abcd";
int ret=my_strcmp(arr1,arr2);
printf("%d\n",ret);
return 0;
}
strncpy
char * strncpy ( char * destination, const char * source, size_t num );
- 拷贝num个字符从源字符串到目标空间。
- 如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
strncat
char * strncat ( char * destination, const char * source, size_t num );
首先拷贝字符串到str1和str2中,然后在str1的\0处开始追加str2。注意当str2的字符数不超过num数,则后面补齐一个\0,并不会补齐到num个数。这一点与strncpy有区别。
strncmp
int strncmp ( const char * str1, const char * str2, size_t num );
- 比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完
strstr
char * strstr ( const char *, const char * );