C语言字符和字符串库函数的使用、注意事项及模拟实现
C语言中没有字符串类型,字符串通常会被放到常量字符串或者字符数组中,在程序的开发过程中要经常对字符和字符串进行处理,这就需要引入一些库函数来简化字符、字符串的处理操作,提高程序的开发效率。
求字符串长度strlen
strlen()
的函数原型为size_t strlen(const char *str)
,用于计算字符串长度(\0
前),\0
仅仅是字符串结束的标志,统计长度时不计算在内。
char *p = "abcdef";
int len = strlen(p);
模拟实现
int myStrlen(const char *pstr)
{
assert(pstr != NULL);
int len = 0;
while(*pstr != '\0')
{
len++;
pstr++;
}
return len;
}
int main()
{
char *p = "abcdefg";
int len = myStrlen(p);
printf("len = %d\n", len);
return 0;
}
模拟实现时使用的返回类型为int
,而库函数中的返回类型为size_t
无符号整型,将字符串的长度定义为无符号整型是很有道理的,因为字符串的长度是一个不小于零的数,但是要注意一个细节,看下面代码:
int main()
{
char *str1 = "abc";
char *str2 = "abcde";
if(strlen(str1) - strlen(str2) > 0)
{
printf("a > b");
}
else
{
printf("a <= b");
}
return 0;
}
输出结果为a > b
,这是因为当两个无符号整型数进行算数运算时,得到的结果仍然是无符号整数,所以strlen(str1) - strlen(str2)
得到的是一个值特别大的整数。
长度不受限制的字符串函数strcpy、strcat、strcmp
strcpy
strcpy
的函数原型为char *strcpy(char *dest, const char *src)
,用于把 src
所指向的字符串复制到 dest
目标数组中,返回值类型为char *
指向最终的目标字符串 dest
的指针。源字符串必须以'\0'
结尾,在拷贝时会将'\0'
也拷贝过去。还要保证目标空间的大小要满足源字符串的大小,避免溢出。
char str[] = "abcdefg";
strcpy(str, "hehe");
printf("%s", str);
// 打印结果为hehe
模拟实现
char* myStrcpy(char* dest, const char* src)
{
assert(dest != NULL);
assert(src != NULL);
char *ret = dest;
while(*dest++ = *src++)
{
;
}
return ret;
}
int main()
{
char str[] = "abcdefg";
char *p = "hehe";
myStrcpy(str, p);
printf("%s", str);
return 0;
}
在使用strcpy
时一定要注意,目标空间不能是一个常量字符串,同时目标空间有足够大的内存大小。以下用法是错误的:
char *dest = "abcdefg";
strcpy(dest, "hehe"); // 错误
char arr[2] = {
0};
strcpy(arr, "hehe"); // 错误
strcat
strcat()函数原型为char *strcat(char *dest, const char *src)
,用于把 src
所指向的字符串追加到 dest
所指向的字符串的结尾,返回值为指向最终的目标字符串 dest
的指针。使用该函数要保证以下几点:
1、源目字符串都要以\0
结尾;
2、目标空间足够大;
3、目标空间可修改。
char arr[20] = "hello";
strcat(arr, "world");
模拟实现
char*