黑马程序员——字符串

------ 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“
//返回 5
long 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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值