求字符串长度 长度不受限制的字符串函数
长度受限制的字符串函数 字符串查找
高级字符串查找 错误信息报告
常见的字符串分类函数 内存操作函数
以下测试历程均在vs2013运行正常
1、求字符串长度
- strlen
size_t strlen(const char * str);
- 字符串以’\0’作为结束标志,strlen函数返回的是在字符串中’\0’前面出现的字符。
- 参数指向的字符串必须以’\0’结尾。
- 函数的返回值类型是 无符号的 。
int main()
{
char str[] = "asdfasf";
int len = 0;
len = strlen(str);
return 0;
}
//【运行结果】:7
2、长度不受限制的字符串函数
strcpy
char *strcpy( char *strDestination, const char *strSource );- 在复制或追加字符串时不会执行溢出检查。如果源和目标字符串重叠,strcpy的行为是未定义的。
strcat
char *strcat( char *strDestination, const char *strSource );- 源字符串必须以’\0’结尾
- 目标空间必须足够大,能容纳下源字符串的内容
- 目标空间必须可以修改
- 同样的,在追加字符串时它也不会执行溢出检查,strcat的行为使未定义的。
strcmp
int strcmp( const char *string1, const char *string2 );- 第一个字符串大于第二个字符串,则返回大于0的数字
- 第一个字符串等于第二个字符串,则返回0
- 第一个字符串小于第二个字符串,则返回小于0的数字
3、长度受限制的字符串函数
strncpy
char *strncpy( char *strDest, const char *strSource, size_t num);- 拷贝num个字符从源字符到目标空间
- 如果字符串的长度小于num,则拷贝完源字符串后,在目标的后边追加0,直到num个。
strncat
char *strncat( char *strDest, const char *strSource, size_t count );- 源字符串的初始字符覆盖了目标字符串最初的终止null字符。
- 如果count大鱼源字符串的长度,则使用眼字符串的长度代替计数,结果以null字符结束。
- 如果在重叠的字符串之间进行赋值,则该行为是标准未定义的。
strncmp
int strncmp( const char *string1, const char *string2, size_t count );- 比较到出现在另个字符不一样,或者一个字符串结束,或者count个字符全部比较完。
4、字符串查找
strchr
char *strchr( const char *string, int c );- strchr函数在字符串中找到c的第一个出现,找到c,返回一个指针,如果没有找到c,则返回NULL。在搜索中包含了空终止字符。
int main()
{
char dst[10] = "abcdef";
char * p = NULL;
p = strchr(dst, 'c');
printf("%d\n", (p-dst));
system("pause");
return 0;
}
//【运行结果】:2
- strrchr
char *strrchr( const char *string, int c );
- strrchr函数在字符串中找到c(转换为char)的最后一个出现的。搜索包括终止null字符。
int main()
{
char dst[10] = "absscdesf";
char * p = NULL;
p = strrchr(dst, 's');
printf("%d\n", (p-dst));
system("pause");
return 0;
}
//【运行结果】:7
- strpbrk
char *strpbrk( const char *string, const char *strCharSet );
- 每一个函数都返回一个指针,指向字符串中任何相同字符的第一次出现的位置,如果两个字符串参数没有相同的字符,则返回空指针。
int main()
{
char src[] = "cd";
char dst[10] = "absscdesf";
char *p = NULL;
p = strpbrk(dst, src);
printf("%d\n", (p-dst));
system("pause");
return 0;
}
//【运行结果】: 4
- strstr
char *strstr( const char *string, const char *strCharSet );
- 每一个函数都返回一个指针,指向字符串中第一次出现的strCharSet,如果strCharSet没有出现在字符串中,则返回NULL。如果strCharSet指向一个长度为0的字符串,函数将返回字符串.
5、高级字符串查找
strspn
size_t strspn( const char *string, const char *strCharSet );- 这个函数返回的是string字符串中==开始部分出现==strCharSet字符串中字符的个数。
int main()
{
char strCharSet[] = "cd";
char string[10] = "cdddsacbsscdesf";
int i = 0;
i = strspn(string, strCharSet);
printf("%d\n", i);
system("pause");
return 0;
}
//【运行结果】:4
- strcspn
size_t strcspn( const char *string, const char *strCharSet );
- 这个函数返回string指向的字符串中==开始部分出现的不在==str2指向字符串中的字符个数
int main()
{
char strCharSet[] = "dasdcd";
char string[10] = "vcdsddsdfsfsacbsscdesf";
int i = 0;
i = strspn(string, strCharSet);
printf("%d\n", i);
system("pause");
return 0;
}
//【运行结果】:0
- strtok
char *strtok( char *str, const char *sep);
- sep参数是个字符串,定义了用作分隔符的字符合集
- 第一个参数指定一个字符串,它包含了0个或者多个由sep字符串中一个或者多个分隔符分割的标记
- strtok函数找到str中的下一个标记,并将其用\0结尾,返回一个指向这个标记的指针
- strtok函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置
- strtok函数的第一个参数为NULL,函数将在同一个字符串中被保存的位置开始,查找下一个标记。
- 如果字符串中不存在更多的标记,则返回NULL指针。
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, " ");
}
system("pause");
return 0;
}
/*【运行结果】: Splitting string -This, a -sample -string.into tokens
This, a
sample
-string.*/
6、错误信息报告
- strerror
char *strerror( int errnum );
- 返回错误码,所对应的错误信息
#include <string.h>
#include <errno.h> //必须包含的头文件
int main()
{
FILE * pf;
pf = fopen("unexist.ent", "r");
if(pf == NULL)
{
printf("%s\n", strerror(errno));
}
return 0;
}
//【运行结果】: No such file or directory
7、常见的字符串分类函数
函数 | 如果它的参数符合下列条件就返回真 |
---|---|
isspace | 空白字符:空格’ ‘,换页’\f’,回车’\r’,制表符’\t’或垂直制表符’\v’ |
isddigit | 十进制数字0~9 |
islower | 小写字母a~z |
isuper | 大写字母A~Z |
8、内存操作函数
- memcpy
void *memcpy( void *dest, const void *src, size_t count );
- 函数memcpy从src的位置开始向复制num个字节的数据到dest的内存位置。
- 这个函数遇到’\0’的时候不会停下来。
- 如果src和dest有任何重叠,复制的结果是未定义的。
memmove
void *memmove( void *dest, const void *src, size_t count );- 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
- 如果源空间和目标空间出现重叠,就的使用memmove函数处理
memcmp
int memcmp( const void *buf1, const void *buf2, size_t count );- 两段内存的内容进行比较,这两段内存分别起始于a和b,共比较length个字节。这些值按照无符号字符逐字节进行比较,函数的返回类型和strcmp函数一样—-负值表示a小于b,正值表示a大于b,零表示a等于b。由于这些值是根据一串无符号字节进行比较的,所以如果memcmp函数用于比较不是单字节的数据如整数或者浮点数就可能出现不可预料的结果。
memset
void *memset( void *dest, int c, size_t count );- 函数把从a开始的length个字节都设置为字符值ch
memchr
void *memchr( const void *buf, int c, size_t count );- 从a的起始位置开始查找字符ch第一次出现的位置,并返回一个指向该位置的指针,它总共查找length个字节。如果在这length个字节中未找到该字符,函数就返回一个NULL指针。