黑马程序员——字符串

来源:互联网 发布:Java二叉树的遍历算法 编辑:程序博客网 时间:2024/05/16 01:08
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

字符串

1. 字符和字符处理

    1) 复习ASCII码
        字符和字符处理函数
         c中存储的值65
          A-Z     65-90
          a-z     97-122
          0-9     48-57
    2) 使用字符判断函数    
        char c = 'A';        int r;        //  需求: 判断一个字母是不是大写字母        //  返回1表示是大写字母        //  返回0表示不是大写字母        r = isupper(c);        printf("%d\n",r);                c = 'a';        r = islower(c);        printf("%d\n",r);                        /*         isdigit(c)     数字字符         isalpha(c)        字母(大小写)         isalnum(c)        数字字符和字母         islower(c)        小写字母         isupper(c)        大写字母         isspace(c)        //空格类字符(' ')       */ 

    3) 使用字符转换函数
        tolower
        toupper
        //字母转化为大写字母
        char bc = tolower('A');
        printf("%c\n",bc);
        bc = toupper('a');
        printf("%c\n",bc);

2. 字符串部分

    1.什么是字符串

  • 简单的字符串”itcast”
  •  一个’i’是一个字符
  •  很多个字符组合在一起就是字符串了

      2. 字符串的初始化

  •   char a[] = “123”;  和 char a [] = {‘1’,’2’,’3’};的区别,可以比较大小
  •   “123”其实是由’1’、’2’、’3’、’\0’组成
  •   “123”的存储分布
  •   字符串的输出”%s”,’\0’是不会输出的
    字符串常量的本质
    
       "hello";

        char str[] = "hello world";
        printf("str = %s\n",str);
        
        //指针指向了一个字符串常量
        //  字符串常量本质上是一个地址, 指向其中第一个字符的地址
        char *p;
        p = "hello world";
        printf("p = %s\n",p);
        
        printf("*p = %c\n",*(p+1));
        printf("*p = %c\n",p[1]);
        printf("p[1] = %c\n",1[p]);
        printf("*p = %c\n",*("hello world"+1));
        printf("*p = %c\n","hello world"[1]);
        printf("*p = %c\n",1["hello world"]);    

3. 字符串转换函数

    需求: "12345"  转化为一个整型   int num = 12345;
    思路:
    1. atoi函数---把一个字符串转化为整型
    2. atof函数
    3. strtol("1010",NULL,2)
 //1. atoi函数---把一个字符串转化为整型        char *str = "-12345";        int num;    //12345                num = atoi(str);        printf("num = %d\n",num);                //测试        //  "12345abc"        //  "12345abc12"        //  "-123"       支持负数        //  "+123"                //2. atof函数        char *str2 = "12.34567";        double num2;                num2 = atof(str2);        printf("num2 = %f\n",num2);                //一个字符串转化为long, 指定进位        //3. strtol("1010",NULL,2)                //二进制数        char *str3 = "1010";        //   第三个参数指定了转化的进制        long num3 = strtol(str3, NULL, 2);        printf("num3 = %ld\n",num3);

 4. 常用的字符串处理函数的使用

    计算字符串长度:     strlen(str)

    字符串拷贝    strcpy(dst, src) //空间
    字符串比较    strcmp(str1, str2) //返回值
    字符串连接    strcat(dst, src) //空间
        //<1>strlen        //<2> strcpy 字符串复制拷贝                char str[2]={};                // str存储字符串 "shijie nihao"        //  不能这样做        //  str = "shijie nihao";                //效果:"shijie nihoa"复制到str中        //细节:  需要注意目标字符串需要有足够的空间        //      否则程序可能"奔溃"        strcpy(str, "shijie nihoa");                printf("str = %s\n",str);                       //<3>字符串比较---比较两个字符串的大小             char *str1 = "helloA";        char *str2 = "helloD";                //需求: 判断这两个字符串是否相同        //解决: 使用strcmp这个函数        //int strcmp(const char *, const char *);        int r = strcmp(str1, str2);        printf("r = %d\n",r);                //返回值:        //  r = 0, 这两个字符串相同的        //  r < 0, 前面字符串比比后面的字符串小        //  r > 0, 前面的字符串比后面的大                     //<4>字符串的链接 strcat        char str[128] = "tian wang gai di hua";        char *src = " xiao ji dun mo gu";                //后面的参数中的字符串拼接到前面字符串的后面        //细节: 前面的数组应该有足够的空间        strcat(str, src);                printf("str  =%s\n",str);

5. 字符串查找

字符查找(查找最后一个字符)   

  //字符串查找               char *str = "sheng huo ru ci mei hao, wo que ru ci bao zao, zhe yang bu hao,bu hao";        char c = 'h';        //char *strchr(const char *, int);        //char *p = strchr(str, c);        char *p = strrchr(str, c);        if(p != NULL)        {            printf("FIND\n");            printf("%c\n",*p);            printf("%s\n",p);        }                        //想要在str中查找一个字符zao是否存在        //char*strstr(const char *, const char *);        char *q = strstr(str, "zao");        if(q != NULL)        {            printf("找到了子串\n");            printf("->%s\n",q);        }

6. 字符串分割
    strtok (token)
    "hello world "      
//字符串分割        //  分割出每个单词 strtok        char str[] = "jin tian-tian.qi hao qing lang";                //参数1: 传入需要分割的字符串        //参数2:  使用那些字符分割这个字符串                char *p = strtok(str, " ");        printf("p-> %s\n",p);                //strtok第二次开始分割, 第一个参数传入NULL        p = strtok(NULL, " ");        printf("p-> %s\n",p);                p = strtok(NULL, " ");        printf("p-> %s\n",p);                       //如何使用while循环和strtok分割字符串        //细节: strtok会把字符串中的分隔符置为'\0'        //细节:   第二个参数中传入多个分隔符组成的字符串        char *p = strtok(str, " -.");        while (p) {            printf("p->%s\n",p);            p = strtok(NULL, " -.");        }                printf("str  = %s\n",str);
指针数组掌握
    
    1. 顺序输出
    2. 逆序输出
    3. 找到最长单词
    4. 排序

7. sprintf 和 scanf

字符串和其他数据转化
 字符串转化为其他类型
    atoi
    atof
    strtol
需求:  把其他类型转化为字符串

    int  age=20;
    int  sex='B';

    "20,B"

    使用sprintf
    
        // 需求:  把其他类型转化为字符串                int  age=20;        int  sex='B';                // 转化为 "20,B"        //  printf干的事情        //   (1)输入的数据转化为字符串        //   (2)输出这个字符串        //printf("%d,%c",age,sex);        char str[256]={};                // 把其他类型的数据, 以指定的格式        //  转化为字符串之后存储到str中        sprintf(str, "%d,%c",age,sex);        printf("str = %s\n",str);                        //sscanf函数        char *info = "zhangsan,B,12,80.5";                char name[256]={};        char gender;        int myage;        float score;                //把info以"%s ,%c,%d,%f"分解出出来        //  把数据放到name,gender ....        sscanf(info, "%[^,],%c,%d,%f",name,&gender,&myage,&score);        printf("name = %s\n gender =%c myage = %d  score = %f",name,gender,myage,score); <br clear="none" />

8. 常用字符串处理函数的实现

如何实现

    strchr    字符串中查找字符
    strrchr    字符串中查找匹配的最后一个字符
#import <Foundation/Foundation.h>// strchr 函数char *myStrchr(const char *str,char a){    char *p=(char *)str;    while(*p){        if(*p==a){            return p;        }        p++;    }    return NULL;    }//strrchr 函数 字符串中查找匹配的最后一个字符//"hello world"//'0'//每次都寻找比较o这个字符,如果找到了,不立即返回,而是继续找下一个指定字符//循环最后在返回最后一个字符的位置char *mystrrchr(const char *str,int a){    char *q=NULL;    char *p=(char *)str;    while (*p) {        if (*p==a) {            q=p;        }        p++;    }    return q;}int main(int argc, const char * argv[]){    @autoreleasepool {                // strchr 字符串中查找字符串        // 习惯:通过一个函数的原型指定函数的使用方法        // 函数原型:char *strchr(const char *,int);        char str[234]="hello world jin tian tian qi hen hao",a;        scanf("%c",&a);//        char *p = myStrchr(str, a);//        if (p) {//            printf("FIND\n");//            puts(p);//        }        char *p = mystrrchr(str,a);        if (p) {            printf("FIND\n");            puts(p);        }                    }    return 0;}  strlen    计算字符串长度#import <Foundation/Foundation.h>//strlen 计算字符串长度//传入参数”hello“//返回 5long mystrlen(const char *str){    char *p=(char *)str;    long count =0;    while (*p) {        p++;        count++;    }    return count;}int main(int argc, const char * argv[]){    @autoreleasepool {        char str[23]="hello";        long count=mystrlen(str);        printf("%ld\n",count);            }    return 0;}

 示例   strcpy    复制字符串

//思路:应该有两个指针:第一个指针指向源字符串char *p;//      第二个指针指向目标字符串,char *q;//              复制:*q=*p;//          结束条件:源字符串字符为”\0“,结束;//功能:源字符串复制到目标字符中//参数1:目标字符串://参数2:源字符串//返回值:返回传入的目标字符串的地址:

#import <Foundation/Foundation.h>// 重点:strcpy 复制字符串//char *str='"hello world"//char buf[]={};//一个一个字符拷贝//char buf[]="hello world";char *mystrcpy(char *dst,const char *src)//const 不能改变*src{    //char *q=(char *)src;    //char *p=dst;    //while 循环完之后,dst指向‘\0’的后面    char *p=dst;    while ((*dst++ = *src++));//括号里面还可以(*src)(*p)    /*{        //源字符串字符,复制给目标字符串;        // *dst=*src;(可有可无)        //dst++;        //src++;    }*/        //*dst='\0';        //return dst;        //保存返回的目标字符串的指针;        return p;//返回值目的:支持链式表达}int main(int argc, const char * argv[]){    @autoreleasepool {        char str[23]="hello";        char buf[234]="";        mystrcpy(buf, str);        puts(buf);            }    return 0;}

示例 strcmp    比较字符串

#import <Foundation/Foundation.h>//strcmp    比较字符串//思路:判断这两个字符串是否相同//”helloA“//”helloD“//两个字符串逐个比较,一旦发现不同,立即返回差值;//比较的退出条件:(1)如果任意一个字符串达到了结尾,退出比较//              (2)或者两个字符是不同的,无需比较,退出比较// 循环完成之后,返回结果(大于0,==0,小于0)char mystrcmp(const char *str,const char *buf){    //while ((str&&buf)&&(*str==*buf)) {    while (str&&(*str==*buf)) {        str++;        buf++;    }    return *str-*buf;}int main(int argc, const char * argv[]){    @autoreleasepool {        char str[23]="hello";        char buf[234]="helloA";        mystrcmp(str, buf);        int r=mystrcmp(str, buf);        printf("%d",r);       }    return 0;}

示例   strcat    连接字符串

#import <Foundation/Foundation.h>//strcat    连接字符串//char str1[124]="hello";//char str2[]="world"//str2这个字符串附加到str1的后面//strcat(str1,str2)//参数dst:表示目标字符串://参数src:表示源字符串//返回值:返回传入函数中的目标字符串的地址://原理:“hello” + “world” = “hello world”//两步:(1)找到目标字符串结尾‘\0’的位置 (2)把源字符串复制到目标字符串的结尾://char *mystrcat(char *dst,const char *src){    char *p=dst;    //找到目标字符串的结尾‘\0’的位置    while (*dst) {        dst++;    }    //dst<---src    //src起始位置的 字符串拷贝到dst起始位置;    while((*dst++=*src++));        return p;}int main(int argc, const char * argv[]){        @autoreleasepool {        char str1[123]="hello ";        char str2[123]="world";        mystrcat(str1, str2);        puts(str1);            }    return 0;}  <br clear="none" />

示例    strstr    字符串中查找字符串

#import <Foundation/Foundation.h>//strstr    字符串中查找字符串//函数用法:char *str=“shi jie ni hao”//char *substr="jie"//在str这个字符串中查找substr的位置//char *p=strstr(str,substr);//原理:“shi jie ni hao”//       jie  逐个比较//参数str,表示传入的主字符串//参数substr,表示传入的字符//返回值:返回substr在str中的位置char *mystrstr(const char *str,const char *substr){    long len = strlen(substr);    while (*str) {        //puts(str);        //puts(substr);        //puts("");        //比较str和substr的前三个字符是否相同        //如果相同,说明找到了子串;        //strncmp()比较两个字符串的前n个字符        if (strncmp(str, substr, len)==0) {            return str;        }        str++;    }    return NULL;}int main(int argc, const char * argv[]){        @autoreleasepool {        char str[234]="shi jie ni hao";        char substr[234]="jie";        char *p=mystrstr(str,substr);        if (p) {            printf("FIND\n");            printf("p=%s\n",p);        }    }    return 0;} 

示例  atoi 函数 功能字符串转化为整数

#import <Foundation/Foundation.h>//实现stoi函数//char str[]="12345";//int num=stoi(str);//原型:int atoi(const char *);//原理:   "1"     '1'-'0'=1        //"12"    '2'-'0'=2  1*10+2=12        //"123"   '3'-'0'=3  12*10+3=123        //"1234"  '4'-'0'=4  123*10+4=1234        //num=num*10+(*str-‘0’)int myatoi(const char *str){    int num=0;    int flag = 1;    //如果第一个字符是 '-'    if(*str == '-')    {        flag = -1;        str++;    }    if(*str == '+')    {        str++;    }    while (*str) {        //*str 每次都是其中的数字字符        num=num*10+(*str-'0');        str++;    }    return num*flag;}int main(int argc, const char * argv[]){        @autoreleasepool {        char str[123]="12345";        int num=myatoi(str);        printf("%d",num);            }    return 0;}#import <Foundation/Foundation.h>int main(int argc, const char * argv[]){        @autoreleasepool {        //有一个字符串        //char str[]="ren you bei huan li he,yue you yin qing yuan que";        //(1)输出每个单词:------使用strock分割//        char str[]="ren you bei huan li he,yue you yin qing yuan que";//        char *p=strtok(str, " ,");//        while (p) {//            printf("p=%s\n",p);//            p=strtok(NULL, " ,");//        }        //(2)所有的单词逆序输出---        //(3)找到最长的单词        //(4)所有单词排序后输出                //        指针数组的基本用法//        int a[12];//        char b[12];//        char *b[12];//        char *a[3]={};//        a[0]="abc";//        a[1]="def";//        a[2]="ghi";//        puts(a[0]);        char str[128]="ren you bei huan li he,yue you yin qing yuan que";        char *a[128]={};        int count=0;  //分割出得单词的个数;        char *p=strtok(str, " ,");        while (p) {            a[count]=p;            count++;            p=strtok(NULL, " ,");            }        //for (int i=0; i<count; i++) {        for (int i=count-1; i>=0; i--) {            puts(a[i]);        }    }    return 0;}



0 0
原创粉丝点击