目录
1、前言:
2、函数介绍
2.1 strlen
2.2 strcpy
2.3 strcat
2.4 strcmp
2.5 strncpy、strncmp、strncat
2.6 strstr
2.7 strtok
2.8 strerror
3、结语
1、前言: 在c语言中,我们经常会对“字符串”进行操作,当然我们可以用for循环的方式来一个字符一个字符的来处理,或者用以下介绍的字符/字符串函数,操作起来非常的方便。
2、函数介绍
2.1 strlen
size_t strlen(const char * str);
- strlen功能:字符串已'\0' 作为结束标志,strlen函数返回的是在字符串中'\0' 前面出现的字符个数(不包含'\0' )。
- 参数指向的字符串必须要以'\0' 结束。
- strlen函数的返回值是size_t类型的,是无符号的,所以如果两个strlen相减的结果不会出现负数。
- strlen的模拟实现(可以采用计数的方法、递归的方法、本次代码为指针-指针的方法)
//模拟strlen,用两个指针记录起始和终止位置void my_strlen(char* pa)
{
int count = 0;
char* str = pa;
while (*pa != '\0')
{
pa++;
count++;
}
printf("%d", (pa - str));
}int main()
{
char arr[] = {"ajkljilbcde"};
my_strlen(arr);
return 0;
}
2.2 strcpy
char* strcpy(char* destination, const char* source );
- strcpy的功能:将源字符中的内容串拷贝到目标字符串中,destination中存入的是目标字符串的元素首地址,source是源字符串的元素首地址。
- 源字符串必须以'\0' 结束,如果源字符串没有‘\0’,内存会一直找,直到找到\0结束,这时候如果目标字符串的空间不够,就会发生越界。
- 会将源字符串中的'\0' 拷贝到目标空间。
- 目标空间必须足够大,以确保能存放源字符串。
- 目标空间必须可修改,不能是常量字符串。
- strcpy的模拟实现(下面的代码,在while部分还可以简化代码,采用while(*des++ = *src++)
char* my_strcpy(char* des, char* src)
{
assert(des && src);
char* ret = des;
while (*src != '\0' )
{
*des = *src;
des++;
src++;
}
*des = *src;
return ret;
}int main()
{
char arr1[20] = {0};
char arr2[] = { "abcdfd" };
my_strcpy(arr1, arr2);
printf("%s",arr1);
return 0;
}
2.3 strcat
char* strcat (char* destination, const char* source );
- 将目标函数的字符串添加到源字符串的后面,从‘\0’这个位置来添加。
- 源字符串必须以'\0' 结束。
- 目标空间必须有足够的大,能容纳下源字符串的内容。
- 目标空间必须可修改。
- strcat不能自己给自己追加
- strcat的模拟实现
char *my_strcat(char *dest, const char*src)
{
char *ret = dest;
assert(dest != NULL);
assert(src != NULL);
while(*dest)
{
dest++;
}
while((*dest++ = *src++))
{
;
}
return ret;
}
2.4 strcmp
int strcmp (const char* str1, const char* str2 );
- strcmp的功能:比较两个字符串的大小,每次比较的是两个字符的ASCII码值,如果没有字符了,就和‘\0’进行比较,如果两个字符相同,那就向后比较,直到不同或遇到‘\0’
- 第一个字符串大于第二个字符串,则返回大于0的数字。
- 第一个字符串等于第二个字符串,则返回0。
- 第一个字符串小于第二个字符串,则返回小于0的数字。
2.6 strstr
char* strstr(const char *str1, const char *str2);
- strstr的功能是: 在一个字符串中找另一个字符串(在str1中找str2这个字符串),看str2是不是str1的子串,str2如果在str1中出现了,就会返回第一次出现的字符的地址。
- 如果str2在str1中没有出现,那就返回空指针(NULL)。
- 模拟实现strstr
char* my_strstr(const char* str1, const char* str2)
{
assert(str1 && str2);
const char* s1 = str1;
const char* s2 = str2;
const char* cur = str1;
while (*cur)
{
s1 = cur;
s2 = str2;
while (*s1 && *s2 && (*s1 == *s2))
{
s1++;
s2++;
}
if (*s2 == '\0')
{
return (char*)cur;
}
cur++;
} return NULL;
//找不到
}
int main()
{
char arr1[] = "abcdeqcdef";
char arr2[] = "cdef";
char* ret = my_strstr(arr1, arr2);
if (NULL == ret)
{
printf("找不到子串\n");
}
else
{
printf("%s\n", ret);
}
return 0;
}
注意:
- str1(s1),str2(s2),默认指向两个字符串的首字符的地址;
- while循环的条件是:s1、s2没有到'\0',s1和s2指向的字符一样。s1指向的是要搜索的字符串("abcdeqabcdef"),s2是遍历的cdef这个字符串。
char* strtok (char* str, const char* sep );
- sep参数是个字符串,定义了用作分隔符的字符集合。
- 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记。
- strtok函数找到str中的下一个标记,并将其用\0 结尾,返回一个指向这个标记的指针。
- strtok函数的第一个参数不为NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
- strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
- 如果字符串中不存在更多的标记,则返回NULL 指针。
- strtok的用法:
int main ()
{
char str[] ="- This, a sample string.";
char * pch;
printf ("Splitting string \"%s\" into tokens:\n",str);
pch = strtok (str," ,.-");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (NULL, " ,.-");
}
return 0;
}
2.8 strerror
char* strerror(int errnum);
- strerror功能:返回错误码对应错误信息的字符串首地址。
【C语言|C语言—字符/字符串函数—strlen、strcpy、strcat、strcmp、strstr、strtok】博主肝代码不容易,如果对你有帮助的话,麻烦点个赞呦!!!
推荐阅读
- C语言学习|C Primer Plus,C语言精华,截图+代码+学习笔记【10000字】【原创】
- C|【c ++ primer 笔记】第4章 表达式
- C|【c ++ primer 笔记】第3章 字符串、向量和数组
- C语言从0到1|【C语言】字符串函数
- 初学至学会C++|初阶C++——C++第二节——类和对象(大全篇)
- 数据结构|数据结构之链表+常见面试题
- C语言从0到1|【C语言】字符串函数及模拟实现strlen&&strcpy&&strcat&&strcmp
- C进阶|关于C语言指针的笔试题
- stm32|基于I2C/SPI总线的温湿度采集与OLED显示