#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
char *str1;
char *str2 = "Hello";
char *str3 = "World";
/*
1,strcpy(dest,src)
此函数原型为 char *strcpy(char* dest, const char *src)
功能为拷贝字符串内容到目的串,把src所指向的内容拷贝到dest
*/
str1 = (char *)calloc(1,sizeof(char));
strcpy(str1,str2);
printf("%s\n",str1); // Hello
/*
2,strcmp(str1,str2)
此函数的函数原型为 int strcmp(const char *str1, const char *str2).
功能为比较两个字符串。
当str1指向的字符串大于str2指向的字符串时,返回正数。
当str1指向的字符串等于str2指向的字符串时,返回0。
当str1指向的字符串小于str2指向的字符串时,返回负数。
*/
if(strcmp(str1,str2)==0){
printf("String1 equal to String2 !\n");
}
/*
3,strcat(dest,src)
此函数原型为 char *strcat(char *dest, const char *src).
功能为连接两个字符串,把src连接到dest后面;返回dest地址
*/
strcat(str1,str3);
printf("%s\n",str1); //HelloWorld
/*
4,strlen(str)
此函数原型为unsigned in strlen(const char *str)
功能为返回字符串str的长度(不包括'\0')。
*/
printf("%lu\n",strlen(str1)); //10
/*
5,strchr() strrchr()
char *strchr(char *str, char c)
功能为返回str中首次出现c的位置之后的字符串,如果str中不含c返回NULL
char *strrchr(char *str, char c)
功能为返回str中最后一次出现c的位置之后的字符串,如果str中不含c返回NULL
*/
printf("%s\n",strchr(str1,'o')); //oWorld
printf("%s\n",strrchr(str1,'o')); //orld
/*
6、strcspn() strspn()
strcspn
原型:size_t strcspn(const char *pstr, const char *strCharset)
在字符串pstr中搜寻strCharsret所包含字符在pstr中第一次出现的位置
strspn
原型size_t strspn(const char *pstr, const char *strCharset)
功能:返回pstr字符串中第一个不在后者出现的下标。
*/
unsigned long n = strcspn(str1,"World");
printf("char in s2 first appear in s1 is %c; pos in s1 is %lu\n",str1[n],n);// l,2
printf("%lu\n",strspn(str1,"HelloKitty")); //5
/*
7、strstr()
函数原型为char *strstr(const char str1, const char *str2)
功能为查找字符串str2在str1中是否出现,找到则返回str1从找到位置开始之后的字符串,否则返回NULL。
*/
char *res = strstr(str1,"llo");
if(!res) {
printf("s2 is not in s1!\n");
} else {
printf("s2 appear in s1 in pos: %s\n",res); //lloworld
}
/*
8、strtoul
原型为unsigned long strtoul(const char *nptr,char **endptr,int base);
将参数nptr字符串根据参数base来转换成无符号的长整型数,endstr 为第一个不能转换的字符的指针。
*/
char *arg = "1234a5";
char *endstr=NULL;
if(strtoul(arg, &endstr, 10)>65535 || !endstr || '\0'!=*endstr){
printf("wrong endstr: %s!\n", endstr); // a5
} else {
printf("%lu is uint16!\n", strtoul(arg, &endstr, 10));
}
/*
9、strdup()
此函数原型为char *strdup(const char *str)
功能为拷贝字符串到新建的内存,返回内存指针。若失败,返回NULL。要注意,返回的指针指向的内存在堆中,所以要手动释放。
*/
char *p = strdup(str1);
printf("%s\n",p);
free(p);
/*
10、strtok
函数原型为char *strtok(char s[], const char *delim);
功能为分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。
在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。
每次调用成功则将delim替换为‘\0’,返回指向被分割出片段的指针。
*/
char str[] = "Jack,Kimi,Lily,Lucy";
//对str_new进行strtok操作,防止str被更改
char *str_new = strdup(str);
//arr用来保存结果
char **arr =(char **)calloc(1,sizeof(char *));
int i = 0;
char *temp = strtok(str_new,",");
while(temp)
{
arr[i] = (char *)calloc(1, sizeof(char));
memcpy(arr[i], temp, strlen(temp)+1);
temp = strtok(NULL,",");
i++;
}
int j = 0;
for(j=0;j<i;j++){
printf("arr[%d]:%s\n", j, arr[j]);
free(arr[j]);
}
free(arr);
free(str_new);
/*
11、strsep
函数原型:char *strsep(char **s, const char *delim);
功能:strtok和strsep两个函数的功能都是用来分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。
*/
char s[]="Number=100&maxMtu=200";
char *name,*value,*next;
value=s; //使指针value 指向字符串str;
for(i=0; i<2; i++) { // 第一次执行时
name = strsep(&value,"="); // 以"="分割字符串,这时strsep函数返回值为 "Number",即"="号之前的字符串
if(!value){ //注意字符串不带“=”时value会是NULL
goto err;
}
next =value; // 这时指针value指向"="号后面的字符串,即"100&maxMtu=200"
value=strsep(&next,"&"); // 这时通过"&"分割字符串,返回值为100,next指 向"maxMtu=200"
if(!value){
goto err;
}
printf("name= %s\n",name); //打印出一轮分割后name的值
printf("value= %s\n",value);
value=next;
}
return 0;
err:
printf("value == NULL!\n");
}
对应输出:
Hello
String1 equal to String2 !
HelloWorld
10
oWorld
orld
char in s2 first appear in s1 is l; pos in s1 is 2
5
s2 appear in s1 in pos: lloWorld
wrong endstr: a5!
HelloWorld
arr[0]:Jack
arr[1]:Kimi
arr[2]:Lily
arr[3]:Lucy
name= Number
value= 100
name= maxMtu
value= 200