C语言字符串函数
求字符串长度
strlen()
strlen函数----求字符串长度的函数
一般形式:
strlen(字符数组)
头文件:
#include <string.h>
函数原型:
size_t strlen(const char* str);
‘\0’ 字符串结束标志.
str指向的字符串必须要以’\0’结束.
strlen()返回的是’\0’前面出现的字符个数(不包括’\0’).
strlen()函数返回值是size_t,是无符号的(注意:无符号数-无符号数=无符号数)
看下面代码:
#include <stdio.h>
#include <string.h>
int main()
{
if (strlen("hyj") - strlen("dhfjrb") > 0)
printf("hahaha\n");
else
printf("hehehe\n");
return 0;
}
//此时打印的是:hahaha
长度不受限制的字符串函数
strcpy()
strcpy函数----字符串复制(拷贝)函数
一般形式:
strcpy(字符数组1,字符串2)
//"字符串2"可以是字符数组名,也可以是一个字符串常量
作用:将字符串2复制到字符数组1中去
头文件:
#include <string.h>
函数原型:
char* strcpy(char* destination,const char* source);
source指向的字符串必须以’\0’结束
strcpy也会将source指向的字符串中的’\0’拷贝到目标空间
目标空间必须足够大,以便容纳被复制的字符串
目标空间必须可变
返回值:返回的是目标空间的起始地址
#include <stdio.h>
#include <string.h>
int main()
{
char str[30] = "helloword";
char arr[] = "china";
strcpy(str, arr);
printf("%s\n", str);//china
return 0;
}
strcat()
strcat函数----字符串连接函数
一般形式:
strcat(字符数组1,字符数组2)
作用:把两个字符数组中的字符串连接起来,把字符串2连接到字符串1的后面,结果放在字符数组1
函数调用后得到一个函数值-----字符数组1的地址
连接时将字符串1后面的’\0’取消(从’\0’从开始连接),最后在新字符串后面保留’\0’;
头文件:
#include <string.h>
函数原型:
char* strcat(char* destination,const char* source);
source指向的字符串必须以’\0’结束
目标空间必须足够大,以便容纳连接后的新字符串
目标空间必须可修改
字符串不能自己给自己追加(即不能自己连接自己:strcat(arr,arr);arr是一个已定义的数组)
strcat函数模拟实现
strcmp()
strcmp函数----字符串比较函数
一般形式:
strcmp(字符串1,字符串2)
字符串的比较规则是:将两个字符串自左至右逐个字符比较(按照ASCII值大小比较),直到遇到不同的字符或’\0’为止
头文件:
#include <string.h>
函数原型:
int strcmp(const char* str1,const char* str2);
如果第一个字符串大于第二个字符串,则返回大于0的数字
如果第一个字符串小于第二个字符串,则返回小于0的数字
如果第一个字符串等于第二个字符串,则返回0
strcmp函数模拟实现
长度受限制的字符串函数
strncpy()
strncpy(字符数组1,字符串2,n)
strncpy函数----将字符串2中前面n个字符复制到字符数组1中去
函数原型:
char* strncpy(char* destination,const char* source,size_t n);
从源字符串拷贝n个字符到目标空间
如果源字符串的长度小于n,则拷贝完字符串之后,在目标的后面追加0(即’\0’),直到n个
strncpy(str1,str2,2)
作用:将str2中前面2个字符复制到str1中,取代str1中原有的最前面2个字符.
但复制的字符个数n不应多于str1中原有的字符(不包括’\0’).
#include <stdio.h>
#include <string.h>
int main()
{
char str1[15]="abcdefghgij"
char str2[]="china";
strncpy(str1,str2,8);
//因为str2中的字符串长度小于8,则拷贝完字符串之后,在目标的后面追加0(即'\0'),直到8个
printf("%s\n",str1);//china
return 0;
}
执行后,str1的状态如下:
c h i n a \0 \0 \0 g i j
strncpy函数模拟实现
strncat()
strncat(字符数组1,字符串2,n)
strncat函数----将字符串2中前面n个字符追加到字符数组1中(从第一个’\0’开始往后追加)去
函数原型:
char* strncat(char* destination,const char* source,size_t num);
#include <stdio.h>
#include <string.h>
int main()
{
char str1[30]="hello\0*******";
char str2[]="china";
strncat(str1,str2,3);
printf("%s\n",str1);//hellochi
return 0;
}
执行后,str1的状态如下:
h e l l o c h i \0 * * * * * * *
由此可以看出:strncat()函数是从第一个’\0’处开始追加的,最后再在追加完后的新字符串后面加个’\0’
strncat函数模拟实现
strncmp()
strncmp(str1,str2,n)
str1和str2为要比较的字符串,n为str1和str2比较的字符数
函数原型:
int strncmp(const char* str1,const char* str2,size_t n);
#include <stdio.h>
#include <string.h>
int main()
{
char str1[] = "hello world";
char str2[] = "hello hyj";
int ret1= strncmp(str1, str2, 5);
int ret2 = strncmp(str1, str2, 6);
int ret3 = strncmp(str1, str2,7);
printf("%d %d %d\n", ret1,ret2,ret3);// 0 0 1
return 0;
}
字符串查找
strstr()
strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL(空指针)。
头文件:
#include <string.h>
函数原型:
char* strstr(const char* str1, const char* str2);
#include <stdio.h>
#include <string.h>
int main()
{
const char* str1 = "helloworld";
const char* str2 = "world";
const char* str3 = "china";
char* ret1 =(char*)strstr(str1, str2);
//因为str1的类型是const char*,所以函数返回值的类型也是const char*,所以需要强制类型转换
//ret1存放的是w的地址
const char* ret2 = strstr(str1,str3);
printf("%s\n%s\n", ret1, ret2);
return 0;
return 0;
}
//输出:
world
(null)
strchr()
strchr(str,c) 函数用于判断字符c是否在字符串str1中。如果在,则该函数返回c在str中第一次出现的地址;否则,返回NULL(空指针)。
头文件:
#include <string.h>
函数原型:
char* strchr(const char* str,char c);
#include <stdio.h>
#include <string.h>
int main()
{
const char* str = "How Do You Do?";
char c1 = 'o', c2 = 'a';
const char* ret1 = strchr(str, c1);
const char* ret2 = strchr(str, c2);
printf("%s\n%s\n", ret1, ret2);
return 0;
}
输出:
ow Do You Do?
(null)
字符串分割
strtok()
strtok函数----字符串切割函数
头文件:
#include <string.h>
函数原型:
char* strtok(char* str1 ,const char* str2);
参数str2是一个字符串,定义了用作分隔符的字符集合
str1指向一个欲分割的字符串,它包含了0个或多个(str2字符串中一个或多个分隔符)分割的标记
strtok函数会改变被操作的字符串,所以在使用strtok函数切割的字符串一般都是临时拷贝的内容并且可修改
当strtok函数在参数str1的字符串中发现str2中所包含的分隔符时则会将其分隔符改为’\0’,并返回一个指向被分割出的部分的指针
第一次调用strtok()函数时,必须给予参数str1字符串,在以后的每次调用则须用NULL(空指针)来替换str1
因为当strtok()的第一个参数不为NULL(空指针)时,函数将找到str1中第一个分隔符,strtok函数将会保存它在字符串str1中的位置
当strtok()的第一个参数为NULL(空指针)时,函数将在字符串str1中被保存的位置开始,查找下一个分隔符
当没有被分割的串时则返回NULL
#include <stdio.h>
#include <string.h>
int main()
{
char str1[] = "Life,depends/on luck";
const char* str2 = ",/ ";//注意/后面还有一个空格字符
char* ret1 = strtok(str1, str2);
printf("%s\n", ret1);
char* ret2 = strtok(NULL, str2);
printf("%s\n", ret2);
char* ret3 = strtok(NULL, str2);
printf("%s\n", ret3);
char* ret4 = strtok(NULL, str2);
printf("%s\n", ret4);
printf("%s\n", str1);//注意此时str1数组的内容改变了
return 0;
}
输出:
Life
depends
on
luck
life
若在运行上面这个程序时出现以下错误:
错误 1 error C4996: ‘strtok’: This function or variable may be unsafe. Consider using strtok_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details. c:\users\就到这吧\documents\visual studio 2013\projects\project3\project3\c.003.cpp 64 1 Project3
你可以在此文件的开头加上:
#define _CRT_SECURE_NO_WARNINGS 1
或者将strtok()函数改为strtok_s()
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main()
{
char str1[] = "Life,depends/not*on luck";
const char* str2 = ",/ *";
char str1_cpy[30] = { 0 };
strcpy(str1_cpy, str1);
char* ret = NULL;
for (ret = strtok(str1_cpy, str2); ret; ret = strtok(NULL, str2))//判断条件也可以写成ret!=NULL;
{
printf("%s\n", ret);
}
return 0;
}
输出:
Life
depends
not
on
luck
#include <stdio.h>
int main()
{
int a = 0;
char b = '\0';
char* c = NULL;
if (a == b && a == (int)c && b == (char)c)
printf("haha\n");
else
printf("hehe\n");
return 0;
}
//输出:
haha
错误信息报告
strerror()
函数原型:
char* strerror(int errnum);
返回值:返回错误码对应的错误信息
头文件:
#include <string.h>
#include <stdio.h>
#include <string.h>
int main()
{
char* str = strerror(1);
printf("%s\n", str);//Operation not permitted
return 0;
}
//错误码 错误信息
0 No error
1 Operation not permitted
2 No such file or directory
3 No such process
4 Interrupted function call
... ...
strerror()函数还有一个用法,如下:
char* str=strerror(errno);
errno是一个全局的错误码的变量
当库函数在执行过程中发生了错误,此时就会把对应的错误码赋值给errno
必须要包含的头文件:
#include <errno.h>
#include <errno.h>
#include <stdio.h>
#include <string.h>
int main()
{
FILE* pfile = fopen("hyj.text", "r");
if (pfile == NULL)
printf("%s\n", strerror(errno));
else
printf("open file success\n");
return 0;
}
若你当前文件所在的文件夹的里面没有hyj.text文件,则会打印:
No such file or directory
否则打印:
open file success
字符串大小写转换函数
strlwr()
strlwr函数----转换为小写的函数
一般形式:
strlwr(字符串)
函数作用:将字符串中的大写字母换成小写字母
注意:只转换字符串中的大写字母,不改变其它字符
头文件:
#include <string.h>
函数原型:
char* strlwr(char* str);
返回值:返回转换后的字符串的地址
#include <stdio.h>
#include <string.h>
int main()
{
char str[] = "How Do You Do?";
char* ret = strlwr(str);
printf("%s\n%s\n", ret, str);
return 0;
}
输出:
how do you do?
how do you do?
strupr()
strupr函数----转换为大写的函数
一般形式:
strupr(字符串)
函数作用:将字符串中的小写字母换成大写字母
注意:只转换字符串中的小写字母,不改变其它字符
头文件:
#include <string.h>
函数原型:
char* strupr(char* str);
返回值:返回转换后的字符串的地址
#include <stdio.h>
#include <string.h>
int main()
{
char str[] = "How Do You Do?";
char* ret = strupr(str);
printf("%s\n%s\n", ret, str);
return 0;
}
输出:
HOW DO YOU DO?
HOW DO YOU DO?