• OC第二节 —— NSString和NSMutableString


    1.为什么需要NSString对象    
        答:在OC中创建字符串时,一般不使用C的方法,
        因为C将字符串作为字符数组,所以在操作时会有很多不方便的地方,
        在Cocoa中NSString集成的一些方法,可以很方便的操作字符串,


    2.oc中字符串和c语言字符串的对比
                “hello world”
            @“hello world”
                
     
           1)输出方式    %@
           2)引用方式
            NSString以@符号开头,表示该字符串是一个oc类型的字符串
            c语言字符串则没有@开头

    3.c语言字符串和NSString的转换
    1)stringWithCString:encoding:消息
             作用:将c字符串按照指定的编码方式转换为oc字符串对象
                NSString *str2 = [NSString stringWithCString:cstr encoding:
                            NSUTF8StringEncoding];

     2)UTF8String消息
             作用:将NSString对象按照UTF8编码转换为c字符串
              并且转换的结果为一个const char *类型字符串
                const char *cstr2 = [str2 UTF8String];

             输出方式:要使用printf才可以输出
           
           3)什么是字符编码
                是一套法则,使用该法则能够对自然语言的字符的一个集合(如字母表或音节表),与其他东西的一个集合(如号码或电脉冲)进行配对。即在符号集合与数字系统之间建立对应关系。
                常见的字符编码:  ASCII GB18030UNICODE

                Unicode :在计算机科学领域中,Unicode(统一码、万国码、单一码、标准万国码)是业界的一种标准,它可以使电脑得以体现世界上数十种文字的系统。直至目前为止的第六版,Unicode 就已经包含了超过十万个字符。

                Unicode是字符集,UTF-32/ UTF-16/ UTF-8 是三种字符编码方案。
                UTF-32:使用4字节的数字来表达每个字母、符号,或者表意文字(ideograph)
                UTF-16: 每个字符只需要2个字节来存储,如果超出0~65535,则采取诡异的                                    技巧来实现。
                UTF-8:  UTF-8是一种针对Unicode的可变长度的编码,使用一至四个字节为                                    每个字符编码。它逐渐成为电子邮件、网页及其他存储或传送文字的                                    应用中,优先采用的编码。互联网工程工作小组(IETF)要求所有                                    互联网协议都必须支持UTF-8编码。
        

    4.NSString的创建方式
            NSString *str =@"ios";  //创建不可变字符串        

        //实例化方法创建字符串
                 //用一个OC常量字符串初始化一个OC的字符串对象
        - (instancetype)initWithString:(NSString *)aString;
        - (instancetype)initWithFormat:(NSString*)format,…;
        - (instancetype)initWithUTF8String:(const char *)bytes;

        //类方法创建字符串
        + (instancetype)stringWithString:(NSString*)aString;
        + (instancetype)stringWithFormat:(NSString *)format,…;
        + (instancetype)stringWithUTF8String:(const char *)bytes;

    NSString的常用方法:

    1、求字符串的长度
            - (NSUInteger)length;
        
        2、通过索引获取相应的字符
            - (unichar)characterAtIndex:(NSUInteger)index;

        3、字符串的比较
            3.1 比较两个字符串是否相等
            //isEqualToString: 消息
                  回忆:c语言中如何比较两个字符串是否相等
            - (BOOL)isEqualToString:(NSString *)aString;
            
            //compare: 消息
            3.2 比较两个字符串的大小
            - (NSComparisonResult)compare:(NSString *)aString;
        
            3.3 不区分大小写进行比较
            //compare: option
            - (NSComparisonResult)compare:(NSString *)aString options:
            NSCaseInsensitiveSearch;

            //caseInsensitiveCompare:消息
            - (NSComparisonResult)caseInsensitiveCompare:(NSString *)aString;




        4、字符串查找

            1) rangeOfString消息    
                    - (NSRange)rangeOfString:(NSString *)aString;

                  作用:查找指定字符串是否在目标字符串中,返回NSRange
            结构体。
                location,
                length    

              如果存在,返回的NSRange中会包含起始位置和长度
              如不存在,NSRange.location == NSNotFound

            练习:1.查找"Hi, I am fine,and you"中"fine"字符串的位置

                
    5、判断前后缀
            - (BOOL)hasPrefix:(NSString *)aString;
            - (BOOL)hasSuffix:(NSString *)aString;

    6、数字串转化为数字
            - (double)doubleValue;
            - (float)floatValue;
            - (int)intValue;
            - (NSInteger)integerValue;
            - (long long)longlongValue;

     7、大小写转化
            - (NSString *)uppercaseString;
            - (NSString *)lowercaseString;

    8、字符串提取

           1)substringFromIndex消息
             作用:从指定位置开始向后提取字符串,返回字符串地址,闭区间

           2)substringToIndex消息
             作用:提取从开头到指定位置的字符串,返回字符串地址,开区间
     

    #import <Foundation/Foundation.h>
    
    int main(int argc, const char * argv[])
    {
    
        @autoreleasepool {
            
            NSString *ocStr = @"iOS";
            
            //1. 求字符串的长度
            NSUInteger len = [ocStr length];
            NSLog(@"len = %lu", len);   //3
            
            //2. 通过索引获取字符
            //ocStr[0]; OC字符串不可以使用下标
            unichar C = [ocStr characterAtIndex:0];
            //unichar 的格式转换符  %C
            NSLog(@"C = %C", C);
            
            
            //3.字符串的比较
            NSString *ocStr1 = @"hello";
            NSString *ocStr2 = @"hellO";
            
            //------比较两个字符串是否相等-------
            //isEqualToString:
            BOOL ret  = [ocStr1 isEqualToString:ocStr2];
            if (ret == YES) {
                NSLog(@"ocStr1 == ocStr2");
            } else {
                NSLog(@"ocStr1 != ocStr2");
            }
            
            /*
             typedef enum
             {
                    NSOrderedAscending = -1L, 
                    NSOrderedSame = 0,
                    NSOrderedDescending = 1
             }NSComparisonResult;
                
             //ret 就是一个枚举变量
             NSComparisonResult ret;
             
             int a;  //定义变量
             typedef int int_32;  //给int类型取了一个新的别名 int_32
             typedef long int_64;
             
             //使用int_32 声明变量
             int_32 b, c, d;
             
             struct stuInfo
             {
                char *name;
                int   age;
             };
             typedef struct stuInfo Stu;
             Stu stu;
             
             
             typedef: 
                    作用:是给类型取别名
             
             
             */
            
            //-------比较字符串的大小----------
            NSComparisonResult ret1 = [ocStr1 compare:ocStr2];
            switch (ret1) {
                case NSOrderedAscending: //-1L
                    NSLog(@"ocStr1 < ocStr2");
                    break;
                case NSOrderedDescending: //1L
                    NSLog(@"ocStr1 > ocStr2");
                    break;
                case NSOrderedSame:
                    NSLog(@"ocStr1 == ocStr2");
                default:
                    break;
            }
            
            //-------忽略字符大小写进行比较-----------
            NSComparisonResult ret2 = [ocStr1 compare:ocStr2 options:NSCaseInsensitiveSearch];
            if (ret2 == NSOrderedAscending) {
                NSLog(@"ocStr1 < ocStr2");
            } else if (ret2 == NSOrderedDescending) {
                NSLog(@"ocStr1 > ocStr2");
            } else {
                NSLog(@"ocStr1 == ocStr2");
            }
            
            
            //4.字符串的查找
            NSString *ocStr3 = @"When i was young, i was a student";
            NSString *ocStr4 = @"was";
            
            /*
             typedef struct _NSRange {
                NSUInteger location;   //下标
                NSUInteger length;     //长度
             } NSRange;
             */
            
            //rangeOfString:(NSString *)aString
            //正向查找,返回第一次出现的字串的信息的结构体
            //如果存在,返回在长串中的起始位置和匹配的长度(短传的有效长度)
            //如果查找失败:返回的起始位置 NSNotFound
            NSRange range;
            range = [ocStr3 rangeOfString:ocStr4];
            if (range.location != NSNotFound) {
                NSLog(@"location: %lu, length: %lu", range.location, range.length);
            } else {
                NSLog(@"Not found!");
                NSLog(@"NSNotFound = %lx", NSNotFound);  //有符号数 01111111111.。11111
            }
            
            //从后往前查找  NSBackwardsSearch
            range = [ocStr3 rangeOfString:ocStr4 options:NSBackwardsSearch];
            if (range.location == NSNotFound) {
                NSLog(@"Not found!");
            } else {
                NSLog(@"location: %lu, length: %lu", range.location, range.length);
            }
            
            //_______________字符串查找练习________________________
            char *cStr = "Hi, I am fine,and you";
            NSString *ocString = [NSString stringWithUTF8String:cStr];
            NSRange range1 = [ocString rangeOfString:@"fine"];
            if (range1.location == NSNotFound) {
                NSLog(@"Not found");
            } else {
                NSLog(@"location: %lu, lenght: %lu", range1.location, range1.length);
            }
            
            
            //5. 判断字符串的前缀和后缀
            //hasPrefix
            //hasSuffix
            
            NSString *site = @"http://www.baidu.com";
            
            //判断site 是否以 http开头
            BOOL ret3 = [site hasPrefix:@"http"];
            NSLog(@"ret3 = %d", ret3);
            
            NSString *mp3Str = @"最炫名族风.mp3";
            ret3 = [mp3Str hasSuffix:@"mp3"];
            NSLog(@"ret3 = %d", ret3);
            
            
            
            //6. 将数字字符串对象-------------->简单数数字
            //@"12345" ---> 12345
            NSString *intStr = @"12345";
            int num = [intStr intValue];
            NSLog(@"num = %d", num);
            
            NSString *floatStr = @"3.14";
            float f = [floatStr floatValue];
            NSLog(@"f = %f", f);
            
            NSInteger inter = [intStr integerValue];
            NSLog(@"inter = %ld", inter);
            
            
            //7. 大小写的转换
            NSString *lowerStr = @"ZHAnGSAN";
            NSString *upperStr = [lowerStr uppercaseString];
            NSLog(@"upperStr = %@", upperStr);
            
            NSString *lowerStr1 = [upperStr lowercaseString];
            NSLog(@"lowerStr1 = %@", lowerStr1);
         
            
            NSString *str1 = [lowerStr capitalizedString]; //将首字母转换为大小字母
            NSLog(@"str1 = %@", str1);
            
            
            //8. 字符串的提取,   提取子串
            NSString *string1 = @"When I was a young, I like a girl on my neibour class";
            //从某个下标开始一直提取到结束  [  ] 闭区间
            NSString *subStr1 = [string1 substringFromIndex:5];
            NSLog(@"subStr1 = %@", subStr1);
            
            //从首字母开始一直提取到参数的前面的一个字符为止,  [ ) 开区间
            NSString *subStr2 = [string1 substringToIndex:4];
            NSLog(@"subStr2 = %@", subStr2);
            
            //根据一个范围提取子串
            NSRange range2 = {1, 4};
            NSString *subStr3 = [string1 substringWithRange:range2];
            NSLog(@"subStr3 = %@", subStr3);
            
            
            
        }
        return 0;
    }
    

     可变字符串常用方法(包含不可变字符串的所有方法):

    #import <Foundation/Foundation.h>
    
    int main(int argc, const char * argv[])
    {
    
        @autoreleasepool {
            
            //使用可变的指针 ----> 不可变对象, 还是不可变字符串
            //NSMutableString *string = @"iOS";
            
            NSMutableString *string = [[NSMutableString alloc] initWithString:@"hello"];
            NSLog(@"string = %@", string);
            
            
            //可变字符串 -- (增、删、改)
            //_____________________增____________________add, append
            //1) 追加
            //增加 (append)
            [string appendString:@"world"];
            NSLog(@"string = %@", string);
            
            [string appendFormat:@"%@, %d", @"Hi", 101];
            NSLog(@"string = %@", string);
            
            //2) 插入
            [string insertString:@"XXXXX" atIndex:3];
            NSLog(@"string = %@", string);
            
            //____________________删除____________________ delete, remove
            
            [string deleteCharactersInRange:NSMakeRange(3, 4)];
            NSLog(@"string = %@", string);
            
            //____________________改______________________change, replace
            
            [string replaceCharactersInRange:NSMakeRange(3, 1) withString:@"@@@@@"];
            NSLog(@"string = %@", string);
            
            
            //____________________重置字符串_______________
            //设置方法
            [string setString:@"laowang"];
            NSLog(@"string = %@", string);
            
        }
        return 0;
    }
    
  • 相关阅读:
    一个网站架构的变迁
    网络编程
    http协议篇
    第1篇 编程能力是什么
    django中的cookies和session机制
    django的认证与授权系统
    python的异常处理
    第0篇
    mysql优化和全局管理杂记
    k8s中pod的资源配置详解
  • 原文地址:https://www.cnblogs.com/laolitou-ping/p/6181474.html
Copyright © 2020-2023  润新知