重点介绍处理字符和字符串的库函数的使用和注意事项
- 求字符串长度(strlen)
- 长度不受限制的字符串函数(strcpy strcat strcmp)
- 长度受限制的字符串函数介绍(strncpy strncat strncmp)
- 字符串查找(strstr strtok)
- 错误信息报告(strerror)
C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在 常量字符串 中或者 字符数组 中。 字符串常量 适用于那些对它不做修改的字符串函数.
函数介绍
strlen(计算字符串的个数)
#include<string.h>
int main()
{
int len = strlen("abcdef");
printf("%d\n", len);
return 0;
}
统计\0之前的字符的个数: 所以答案是6.
注意事项
- 字符串以'\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包 含 '\0' )。
- 注意函数的返回值为size_t,是无符号的( 易错 )=unsigned int
比如:
#include <stdio.h>
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
自己可以写一个strlen的函数:
int my_strlen(const char* str)
{
int count = 0;
while (*str != '\0')
{
count++;
str++;
}
return count;
}
int main()
{
int len = my_strlen("abcdef");
printf("%d\n", len);
return 0;
}
strcpy(字符串拷贝)
char* strcpy(char * destination, const char * source );
下面看这样的一行代码:
char arr1[] = "abcdefg1";
char arr2[] = "bit";
strcpy(arr1, arr2);
可以看到拷贝过去把\0也一起拷贝了过去
注意事项:
- 源字符串必须以 '\0' 结束。
- 会将源字符串中的 '\0' 拷贝到目标空间。
- 目标空间必须足够大,以确保能存放源字符串。
- 目标空间必须可变。
模拟实现这个函数代码为:
#include<string.h>
#include<assert.h>
void my_strcpy(char* dest, char* src)
{
assert(dest != NULL);
assert(src != NULL);
while (*src != '\0')
{
*dest = *src;
dest++;
src++;
}
*dest = *src;//把'\0'拷贝过去
}
int main()
{
char arr1[] = "abcdefg1";
char arr2[] = "bit";
my_strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
下面是满分代码:(代码简洁)需要理解
#include<assert.h>
char* my_strcpy(char* dest, char* src)
{
assert(dest != NULL);
assert(src != NULL);
char* ret = dest;
//拷贝src指向的字符串到dest指向的空间,包括'\0'
while (*dest++ = *src++)
{
;
}
return ret;
//返回目的空间的起始地址
}
int main()
{
char arr1[] = "abcdefghi";
char arr2[] = "bit";
my_strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
strcat(字符串追加)
char * strcat ( char * destination, const char * source );
#include<string.h>
int main()
{
char arr1[] = "hello";
char arr2[] = "world";
strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
这么写对不对呢?运行一下结果崩溃了,为什么呢?
arr1的数组本来就那么长,你强行追加到后面,导致数组越界了,目标空间不够大导致的
注意事项:
- 目标空间必须有足够的大,能容纳下源字符串的内容。
- 源字符串必须以 '\0' 结束。
看这行代码体会一下这个函数工作原理:
char arr1[30] = "hello\0xxxxxxxxxx";
char arr2[] = "world";
strcat(arr1, arr2);
printf("%s\n", arr1);
return 0;
字符串自己给自己追加,如何?
答案:程序会崩溃 '\0'被追加没了
模拟实现这个函数:
#include<assert.h>
char* my_stract(char* dest, const char* src)
{
char* ret = dest;
assert(dest && src);
//1.找到目的地字符串的'\0'
while (*dest != '\0')
{
dest++;
}
//2.追加 类似strcpy功能
while (*dest++ = *src++)
{
;
}
//
return ret;
}
int main()
{
char arr1[30] = "hello";
char arr2[] = "world";
my_stract(arr1, arr2);
printf("%s\n", arr1);
return 0;
}