字符函数和字符串函数
1.函数介绍
1.1strlen
1.字符串已经 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前面出现的字符个数(不包含 ‘\0’ )。
2.参数指向的字符串必须要以 ‘\0’ 结束。
注意函数的返回值为size_t,是无符号的( 易错 )
3.学会strlen函数的模拟实现
size_t strlen ( const char * str );
#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; }
2.2strcpy
char * strcpy(char * destinnation, const char* source)
1.源字符串必须以 ‘\0’ 结束。
2.会将源字符串中的 ‘\0’ 拷贝到目标空间。
3.目标空间必须足够大,以确保能存放源字符串。
4.目标空间必须可变。
5.学会模拟实现。
2.3 stract
char * strcpy(char * destination,const char* source)
源字符串必须以 ‘\0’ 结束。
目标空间必须有足够的大,能容纳下源字符串的内容。
目标空间必须可修改。
2.4 strncpy
char * strncpy(char* destnation,const char* source,size_t num);
1.拷贝num个字符从源字符串到目标空间
2.如果源字符的长度小于num,则拷贝完源字符串之后,在目标后面追加00,直到num个
2.5 strncmp
int strncmp(const char* str1,const char* str2,size, size_num);
比较到出现另一个字符不已昂或者字符串结束或者num个字符全部比较完
/* strncmp example */
#include <stdio.h>
#include <string.h>
int main ()
{
char str[][5] = { "R2D2" , "C3PO" , "R2A6" };
int n;
puts ("Looking for R2 astromech droids...");
for (n=0 ; n<3 ; n++)
if (strncmp (str[n],"R2xx",2) == 0)
{
printf ("found %s\n",str[n]);
}
return 0; }
2.6 strstr
char *strstr(const char*,const char *);
/* strstr example */
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] ="This is a simple string";
char * pch;
pch = strstr (str,"simple");
strncpy (pch,"sample",6);
puts (str);
return 0;
}
2.7 strerror
char *strerror(int errnum);
返回错误码,所对应的错误信息
/* strerror example : error list */
#include <stdio.h>
#include <string.h>
#include <errno.h>//必须包含的头文件
int main ()
{
FILE * pFile;
pFile = fopen ("unexist.ent","r");
if (pFile == NULL)
printf ("Error opening file unexist.ent: %s\n",strerror(errno));
//errno: Last error number
return 0;
}
Edit & Run
2.8 memcpy
void * memcpy(void* destination ,const void * source,size_t num)
函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
这个函数在遇到 ‘\0’ 的时候并不会停下来。
如果source和destination有任何的重叠,复制的结果都是未定义的。
/* memcpy example */
#include <stdio.h>
#include <string.h>
struct {
char name[40];
int age;
} person, person_copy;
int main ()
{
char myname[] = "Pierre de Fermat";
/* using memcpy to copy string: */
memcpy ( person.name, myname, strlen(myname)+1 );
person.age = 46;
/* using memcpy to copy structure: */
memcpy ( &person_copy, &person, sizeof(person) );
printf ("person_copy: %s, %d \n", person_copy.name, person_copy.age );
return 0;
}
memmove
void *memove( void* destination,const void* source,size_y num);
和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。
如果源空间和目标空间出现重叠,就得使用memmove函数处理。
/* memmove example */
#include <stdio.h>
#include <string.h>
int main ()
{
char str[] = "memmove can be very useful......";
memmove (str+20,str+15,11);
puts (str);
return 0;
}
2.字符分类函数
iscuntr:任何控制字符
isspace:空白字符
isdigit:十进制0-9
isxdigit:十六进制
islower:小写字母
isupper:大写字母
isalpha:字母a-z 或 A-Z
iaslnum:字母或数字
ispunct:标点符号
isgraph:任何图形字符
isprint:任何可打印字符,包括图形字符和空白字符