字符函数和字符串函数的关系,字符串函数的用法
1.strlen
size _ t strlen(const char * str);
1.字符串以 \0 结尾,strlen函数返回字符串中出现在 \0 之前的字符数不包括( \0 )。
2.参数指向的字符串必须以“\0”结尾。
3.注意,函数的返回值是size_t,它是无符号的(容易出错)
用不变递归函数实现strlen
#include assert.h
无符号整数my_strlen(const char* p)
断言(p);
if (*p!=\0)
return(my _ strlen(p)1);
其他
返回0;
int main()
char arr[]= abcdef ;
my _ strlen(arr);
printf(%d ,my _ strlen(arr));
2.strcpy
charc py(char destination,const char * source));
将源复制到目标
源字符串必须以“\0”结尾。
将源字符串中的“\0”复制到字符空间中。
目标空间必须足够大,以容纳源字符串。
目标必须是可变的。
学会模拟实现。
#包含字符串. h
char * my_strcpy(char* p1,const char* p2)
断言(p1!=NULL);
断言(p2!=NULL);
char * ret=p1
//将p2指向的字符串复制到p1指向的空间,包括 \0
while(* P1=* p2);
返回ret//返回目标空间的起始地址
int main()
char arr 1[]= abcdef ;
char arr 2[]= bit ;
//strcpy(arr1,arr 2);
my_strcpy(arr1,arr 2);
printf(%s ,arr 1);
返回0;
}
3.strcat
char stract(char目标,const char*源)
1.源字符串必须以“\0”结尾。
2.目标空间必须足够大,以容纳下一个源字符串的内容。
3.目标空间必须是可修改的。
4.把字符串追加到它本身怎么样?
5.自己实现strcat
//实现strcat
char* my_strcat(char* p1,const char* p2)
char * p3=p1
while(* P1);
P1-;
while(* P1=* p2);
返回P3;
int main()
char arr 1[20]= abcdef ;
char arr2[]=爱;
char *p=my_strcat(arr1,arr 2);
printf(%s\n ,p);
返回0;
}
4.strcmp
int strcmp ( const char str1,const char str 2);
比较两个字符串
比较c字符串str1和c字符串str2。
这个函数开始比较每个字符串的第一个字符。如果它们彼此相等,继续使用下面的字符对,直到字符不同或到达结束空字符。
这个函数执行字符的二进制比较。有关考虑特定于区域设置的规则的函数,请参见strcoll。
标准:
1.如果第一个字符串大于第二个字符串,将返回一个大于0( 0)的数字。
如果第一个字符串等于第二个字符串,将返回0。
3.如果第一个字符串小于第二个字符串,将返回一个小于0( 0)的数字。
4.那么如何判断两根弦呢?
用函数实现strcmp
//自己实现strcmp
int my_strcmp(常量字符* p1,常量字符* p2)
断言(P1 p2);
While (*p1==*p2)//通过判断两者是否相等可以进去。
if (*p1==\0 )
返回0;
P1;
p2;
if (*p1 *p2)
返回1;
else if (*p1 *p2)
return-1;
int main()
char * p1= abcdefgh
char * p2= abcdefgh
int ret=my_strcmp(p1,p2);
printf(%d ,ret);
返回0;
}
5.strncpy
char strncpy ( char目的地,const char * source,size _ t num);
1.将num个字符从源字符复制到目标空间。
2.如果源字符串的长度小于num,则在复制源字符串后将0追加到后面,直到追加到sum。
3.例子
//自己实现strncpy
char* my_strncpy(char* p1,const char* p2,int k)
断言(P1 p2);
int a=0;
char * p3=p1
for(a=0;答答)
if (*p2==\0 )
while (a k (*p1=\0 ))
返回P3;
} * p1=* p2
返回P3;
int main()
char arr 1[30]= zhangyanshu ;
char arr2[]=爱;
int k=0;
扫描文件( %d ,
char* p=my_strncpy(arr1,arr2,k);
printf(%s\n ,p);
返回0;
}
6.strncat
char strncat ( char destination,const char * source,size _ t num);
1.从字符串中追加字符
2.将源的第一个字符追加到目标,并终止空字符。
3.如果源中C字符串的长度小于num,则只复制空字符终止之前的内容。
4.实现strncat(类似于库函数)
//自己实现strncat
char* my_strncat(char* p1,const char* p2,unsigned int k)
char * p3=p1
断言(P1 p2);
while(* P1);
-P1;
while (k - (*p1=*p2))
if (*p1==\0 )
返回P3;
* p1= \ 0
返回P3;
int main()
char arr1[30]=我爱你;
char arr 2[]= zhangyanshu ;
int k=0;
扫描文件( %d ,
char *ret=my_strncat(arr1,arr2,k);
printf(%s\n ,ret);
返回0;
}
7.strncmp
int strncmp ( const char str1,const char str2,size _ t num);
比较两个字符串的字符。
比较c字符串str1的数量和c字符串str2的数量。
这个函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续使用下面的字符对,直到字符不同,直到到达结束空字符,或者直到两个字符串中的数字字符匹配,以先出现的为准。
例子
//自己实现strncmp
int my_strncmp(const char* p1,const char* p2,size_t p)
断言(P1 p2);
- p1,-p2;
while (p - ( *p1==*p2))
if (*p1!=*p2)
if (*p1 *p2)
返回1;
其他
return-1;
返回0;
int main()
const char * arr1= abcdef
const char * arr2= abcdxyz
int k=0;
扫描文件( %d ,
int ret=my_strncmp(arr1,arr2,k);
if (ret==0)
printf( equal \ n );
else if (ret==1)
Printf(上部字符大于下部字符);
其他
Printf(下面的字符大于上面的字符);
返回0;
}
8.strstr
const char strstr ( const char str1,const char * str 2);
查找子字符串
返回指向str1中第一个str2的指针,如果str2不是str1的一部分,则返回空指针。
匹配过程不包括终止空字符,但它会到此为止。
例子
//自行实现strstr要点!
char* my_strstr(const char* p1,const char* p2)
断言(P1 p2);
if (*p2==\0 )
return(char *)P1;
const char * m=NULL
const char * n=NULL
while (*p1)
m=p1,n=p2
而(m n!(* m-*n))//如果减法为0,感叹号为真,继续执行。
m,n;
if (*n==\0 )
return(char *)P1;
if (*m==\0 )
返回NULL
返回NULL
int main()
const char * arr1= abc
const char * arr2= abcdef
const char* p=my_strstr(arr1,arr 2);
if (p==NULL)
Printf(未找到\ n );
其他
Printf (Found %s\n ,p);
返回0;
}
9.strtok
char strtok ( char str,const char *分隔符);
段落引用
将字符串拆分成标签
对这个函数的一系列调用将str分割成标记,这些标记是连续的字符序列,由作为分隔符一部分的任何字符分隔。
段落引用
在第一次调用时,这个函数需要一个C字符串作为str的参数,它的第一个字符作为扫描令牌的起始位置。在后续调用中,该函数需要一个空指针,并使用紧接在最后一个标记末尾之后的位置作为扫描的新开始位置。
段落引用
为了确定标记的开始和结束,该函数首先从开始位置扫描分隔符中不包含的第一个字符(该字符将成为标记的开始)。然后从令牌的开头扫描分隔符中包含的第一个字符,它将成为令牌的结尾。如果找到结束空字符,扫描也将停止。
段落引用
标记的这一端自动替换为一个空字符,标记的开头由函数返回。
段落引用
在strtok的调用中找到str的终止空字符后,所有后续对此函数的调用(以空指针作为第一个参数)都将返回空指针。
段落引用
找到最后一个标记的点由函数在内部保留,供下一次调用使用(不需要特定的库实现来避免数据争用)。
使用
//strtok
int main()
char arr[]= w 18602600146 @ 163 . com ;
char p[]=@ . ;
char buf[1024]={ 0 };
strcpy(buf,arr);
//剪切buf中的字符
char * ret=NULL
for (ret=strtok(buf,p);ret!=NULLret=strtok(NULL,p))
printf(%s ,ret);
返回0;
}
10 .压力
char * strerror(int errnum);
错误数量
打错了。
返回值
指向描述错误的错误字符串的指针。
1.字符分类功能
字符转换功能
托洛尔
将大写字母转换成小写字母。
如果C是一个大写字母,并且有一个等价的小写字母,则将C转换为它的小写等价字母。如果这种转换是不可能的,返回值是C不变。
请注意,什么被认为是一个字母可能取决于所使用的地区;在默认的“C”语言环境中,大写字母是以下任意一种:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z,分别翻译为:A B C D E F G H I J K L M O P Q R S T U V W X Y Z。
在其他语言环境中,如果一个大写字符有多个对应的小写字符,该函数总是为相同的C值返回相同的字符。
在C #中,这个函数的特定于地区的模板版本(tolower)存在于标题地区中。
大写
int toupper(int c);
将小写字母转换成大写字母
如果C是小写字母,并且有一个等价的大写字母,则将C转换为它的大写等价字母。如果这种转换是不可能的,返回值是C不变。
12.memcpy
块拷贝
void memcpy ( void destination,const void * source,size _ t num);
复制内存块
将num byte值从源指向的位置直接复制到目标指向的内存块中。
为了避免溢出,目标参数和源参数所指向的数组的大小应该至少为num字节,并且不应该重叠(memmove是重叠内存块的一种更安全的方法)。
自己实现memcpy。
#include assert.h
void* my_memcpy(void* dest,const void* src,size_t p)
断言(dest src);
void * arr=dest
如果(目的地src)
while (p -)
*(char *)dest=*(char *)src;
((char *)dest);
((char *)src);
while (p -)
*((char *)dest p)=*(char *)src p);
int main()
int arr1[]={ 1,2,3,4,5,6,7,8,9,10 };
int I=0;
my_memcpy(arr1,arr1 3,20);
for(I=0;我我)
printf(%d ,arr 1[I]);
返回0;
}
13.memcmp
块比较
int memcmp ( const void ptr1,const void ptr2,size _ t num);
比较两个内存块
将ptr1指向的内存块的第一个num字节数与ptr2指向的第一个字节数进行比较,如果都匹配,则返回零,如果不匹配,则返回一个不为零的值,指示哪个值更大。
注意,与strcmp不同,这个函数在找到一个空字符后不会停止比较。
记忆集
void memset ( void ptr,int value,size _ t num);
填充内存块
将ptr指向的内存块的前一个字节数设置为指定值(解释为无符号字符)。
//内存集
int main()
char arr[10]=“”;
memset(arr, # ,10);
int I=0;
for(I=0;我我)
printf(%c ,arr[I]);
返回0;
}
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。