strlen 字符串长度
长度不受限制的字符串函数
strcpy 字符串拷贝
strcat 字符串追加(拼接)
strcmp字符串比较
长度受限制的字符串函数(本身不考虑’\0’)
strncpy 字符串拷贝
strncat 字符串追加(拼接)
strncmp 字符串比较
字符串查找
strstr 在一个字符串中查找另一个字符串
strtok 在字符串中截取字符串or字符
错误码描述
strerror
strlen 求字符串长度
字符串以’\0’结尾,
strlen求字符串的长度是返回字符串中’\0’前面出现的字符个数(不包括’\0’)
使用很简单,如下:
#include<stdio.h>
#include<string.h>//字符串函数的头文件
int main()
{
const char *str = "abcdef";
int len = strlen(str);
printf("%d\n", len);
return 0;
}
- 如何比较两个字符串的长度?
上图显然是错误的,直接看就可以求出str1>str2
之所以出现上图的结果,原因是:str1、str2都是无符号数,所以它们永远大于0
所以,字符串比较直接求长度然后比较就好,代码如下:
#include<stdio.h>
#include<string.h>
int main()
{
char *str1 = "abcdef";
char *str2 = "cccc";
if (strlen(str2) > strlen(str1))
{
printf("str2>str1\n");
}
else
{
printf("str1>str2\n");
}
return 0;
}
strcpy 字符串拷贝
char* strcpy(char* destination, const char* source);
源字符串必须以’\0’结尾,所以会将源字符串中的’\0’也拷到目标空间中
且目标空间可变
使用如下:
char str1[20] = "abcdef";//目标空间必须可变,所以不能用 char *str1来定义了
char *str2 = "hijk";
printf("before:%s\n", str1);
strcpy(str1, str2);//把str2拷贝到str1中
printf("after:%s\n", str1);//结果是hijk
strcat 字符串追加(拼接)
不能自己给自己拼接
char* strcat ( char* destination, const char* source );
使用如下:
char str1[20] = "abcdef";
char *str2 = "hijk";
printf("before:%s\n", str1);
strcat(str1, str2);
printf("after:%s\n", str1);
strcmp字符串比较
从左往右比较,比较的是字符的ASCII,与长度无关
int strcmp(const char* str1, const char* str2);
'\0’的ASCII比字符的ASCII小
标准规定:
- 第一个字符串大于第二个字符串,则返回大于0的数字(1)
- 第一个字符串等于第二个字符串,则返回0
- 第一个字符串小于第二个字符串,则返回小于0的数字(-1)
使用如下:
const char *str1 = "abcdef";
const char *str2 = "hijk";
int ret = strcmp(str1, str2);
printf("%d\n", ret);
a的ASCII比hdASCII小,所以直接返回-1
注:判断两字符串是否相等,比较后是否为0
if(0==strcmp(str1,str2))//一定要写 ==0
{
printf("str1==str2\n");
}
else
{
printf("str1!=str2\n");
}
strncpy 字符串拷贝
char* strncpy(char* destination, const char* source, size_t num);
//指定了要拷num元素
本身不考虑’\0’,所以拷几个元素就在源字符串从头覆盖几个元素,(strcpy中源字符串必须以’\0’结尾)
strncat 字符串追加(拼接)
char* strncat ( char* destination, const char* source, size_t num );
使用如下:
char str1[20] = "abcd";
const char *str2 = "hij";
printf("before:%s\n", str1);
strncat(str1, str2, 2);
printf("after:%s\n", str1);
- 可以给自己给自己拼接
strncmp字符串比较
可以指定范围比较
int strncmp ( const char * str1, const char * str2, size_t num );
使用如下:(假如比较前4个)
const char* str1 = "ab cd";
const char* str2 = "ab def";
int ret = strncmp(str1, str2, 4);
printf("%d\n", ret);
d的ASCII比C大,所以结果为-1
strstr 查找子串
const char* str = "abcdefghij";
const char* str1 = "cde";
char* ret = strstr(str, str1);//求str1是否为str的子串,找到之后,从子串起始位置开始返回
char* ret1 = strstr(str, "bcd");//查找bcd是否为str的子串,...
printf("ret:%s\n", ret);
printf("ret1:%s\n", ret1);
strtok 字符串截取
char * strtok ( char * str, const char * delimiters );
//参数一:字符串 参数二:分隔符
- 调用一次strtok截取一个子串,第二次调用strtok,将第一个参数设置为NULL
- strtok函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置
- strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记
- 如果字符串中不存在更多的标记,则返回NULL指针
使用如下:
char str[] = "he_llo world,!";
char* ch = strtok(str, " _,");//用多种分隔符截取(跟分隔符顺序没有关系)
while (ch != NULL)
{
printf("%s\n", ch);
ch = strtok(NULL, " _,");// 继续截取子串
}
strerror
char * strerror ( int errnum );
//参数为错误码
- 通过strerror可以将错误码显示为错误码描述
- 打开失败时,errno会被设置:没有错误,为0;有错误,errno会设置成对应的错误码(用strerror知道错误码描述)
- 头文件是<errno.h>
- 在VS2013平台上,有43个错误码
- main函数的返回值叫进程的退出码