c语言str系列函数

#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

猜你喜欢

转载自blog.csdn.net/qq_15437629/article/details/81837375