zoukankan      html  css  js  c++  java
  • objective-c系列-NSString

    C中没有字符串变量的概念
         只有一个字符串常量的概念
         :   “abcd”
         c中,用一个字符串指来指向一个内存地址,
         然后从该地址往后,遇到''结束,这一段
         内存就表述为一个字符串
         char *s=地址;
         那么s就代表一个c字符串
         c字符串符的处理有一套函数:
         strlen  求字符中长度,只算有效字符个数,不含''
         strcpy  字符串复制
         strncpy  指定长度复制
         strcat   连接两个字符串
         strncat  指定长度连接
         strchr   在字符串中从前往后查找某一个字符,返回地址
         strrchr  在字符串中从后往前查找某一个字符,返回地址
         strstr   在字符串中找子串,并返回子串的地址
         strcmp   比较两字符串的大小
         strncmp  指定长度内比较两个字符串的大小
         strtok   分割字符串
         strpbrk   
         说明:    s1, “abcde1xx”
                  s2, "123"
                strpbrk(s1, s2)
         strcpsn
         strpsn
         oc的字符串一种对象,同样需要提供一套操作字符串的方法
         对比:
                C字符串            oc字符串
         常量:  "abc"             @"abc"
         变量:   char *           NSString*
         求长度:  strlen          length
         查找:   strchr(s1,'c')     ?
                 strstr(s1,s2)      ?
         比较     strcmp             ?
    ****************************************************
    //定义一个字符指针,让它指向一个字符串常量
        char * cstr="abc";
    //定义一个oc的字符串对象(指针),让它指向一个oc字符串常量
        NSString* ocstr=@"abc";
    ****************************************************
    //求长度
        //C字符串求长度:
        printf("cstr长度为:%ld ", strlen(cstr));
        //oc字符串求长度:
        NSLog(@"ocstr的长度为:%lu", [ocstr length]);
    ****************************************************
    //用构造方法来构造oc字符串
    void initForNSString(void)
    {
        NSString * str1 = [[ NSString alloc]initWithFormat:@"[%i]-[%c]-[%@]-[%s]",123,'a',@"ocstring", "cstring" ];
        
        NSLog(@"str1: %@", str1);
        
    //    不要使用:NSString * str2 = [[ NSString alloc]initWithString:@"literal"];
    //    而要直接使用:  NSString *str2 = @"literal";
        NSString *str2 = [[ NSString alloc]initWithString:str1];  //等效于:  NSString * str2 = str1;
    NSLog(@"str1:%p  str2:%p", str1, str2);// str1和str2地址相同,很明显系统不允许浪费内存
    ****************************************************
        //c字符串转为oc字符串
        NSString *str3 = [[ NSString alloc]initWithUTF8String:"cstring"];
    //    NSString *strr1 = @"aerg";
        NSLog(@"str3: %@", str3);
        
        
        char buf[]="abcd";
        NSString *str4 = [[ NSString alloc]initWithUTF8String:buf];
        NSLog(@"str4: %@", str4);
    ****************************************************
    相应的类方法生成字符串
        NSString *str1 = [ NSString stringWithFormat:@"[%i]-[%s]",123,"cstring"];
        NSString *str2 = [ NSString stringWithString:str1];
        NSString *str3 = [NSString stringWithUTF8String:"cstring"];
    ****************************************************
    //比较两个oc字符串的大小
        //回顾: c:  strcmp(s1,s2) s1="ab", s2="af"
        //       返回值:   'b'-'f'
        //  oc字符串的比较结果只有三个值: -1,0,1
        //  oc把这三个值定义成枚举:
        //比较方法:
    //    NSComparisonResult;
        
        
    //    typedef NS_ENUM(NSInteger, NSComparisonResult) {NSOrderedAscending = -1L, NSOrderedSame, NSOrderedDescending};
        
    //    typedef enum {NSOrderedAscending=-1,NSOrderedSame,NSOrderedDescending} NSComparisonResult;
        NSComparisonResult result=[s1 compare:s2];
        switch (result) {
                //         升序
            case NSOrderedAscending:
                NSLog(@"s1<s2");
                break;
            case NSOrderedDescending:
                NSLog(@"s1>s2");
                break;
            case NSOrderedSame:
                NSLog(@"s1==s2");
                break;
            default:
                break;
        }
        //比较两个字符串是否相等
        if( [@"abc" isEqualToString:@"abc"] )
            NSLog(@"abc is equal to abc");
        else
            NSLog(@"abc is not equal to abc");
    }
    ****************************************************
    //访问字符串的某个字符
        //  char *s="abc";   访问: s[i] *(s+i)
        //  oc的字符串不能用[i]
        NSString * str=@"123456789";
        unichar ch=[str characterAtIndex:0];
        printf("ch=%c ",ch);
    ****************************************************
    //求子串
        //认识一个结构体:
        //  NSRange
    //    typedef struct _NSRange {
    //        NSUInteger location;  //起始下标
    //        NSUInteger length;  //长度
    //    } NSRange;
        NSString * string = @"12345abc9";
        // rangeOfString:  方法返回的是一个结构体
        NSRange range= [string rangeOfString:@"abc"];
        NSLog(@"起始下标:%lu, 长度:%lu", range.location,range.length);
        
    // 从下标起到末尾
        NSString *substr1= [string substringFromIndex:2];
        NSLog(@"substr1: %@",substr1);// 345abc9
    // 从开始到下标处停止(不包括)
        NSString *substr2 = [ string substringToIndex:2];
        NSLog(@"substr2: %@", substr2);//12
        //结构体之间的赋值:
        //        结构体初始化定义时用大括号
        NSRange r1 = {5,3};
        NSRange r2;
        
        //    强转后赋值
        r2=(NSRange){5,3};//不能写为:r2 = {5, 3};必须强转//论声明时初始化的好处
    //指定取出某一连续部分
        NSString *substr3 = [ string substringWithRange: NSMakeRange(5, 3) ];
        NSLog(@"substr3: %@", substr3);
     
     //XMakeRange是一个带参宏
    //带参宏,也叫宏函数,但不是真正的函数,只做替换
    #define XMakeRange(loc, len) (NSRange){loc,len}
        NSString *substr4 = [string substringWithRange:XMakeRange(5, 3)];
        NSLog(@"substr4: %@", substr4);
     
    ****************************************************
    //字符串的其它方法
        float f= [@"1.23a"  floatValue] ;
        NSLog(@"f=%f",f);
        
        float f2 = [@"abc1.23abc" floatValue];
        NSLog(@"f2=%f",f2);
        
        float f3 = [@"123abc345" floatValue];
        NSLog(@"f3=%f",f3);
        
        //  floatValue  ->  atof
        
        NSInteger i=[@"123abc" integerValue];
        NSLog(@"i=%li",i);
        
        int i2 = [@"123abc" intValue];
        NSLog(@"i2=%i", i2);
        //  intValue  ->  atoi
        //  integerValue -> atol
        
        BOOL bl = [@"02abc" boolValue];
        if (bl) {
            NSLog(@"bl为真");
        }
        else{
            NSLog(@"bl为假");
        }
        
        //大小写转换
        
        NSString * srcStr = @"ABCdef";
        NSString * upstr= [srcStr uppercaseString];
        NSString *lowStr=[srcStr lowercaseString];
     
        //oc字符串转c字符串
        NSString *ocStr=@"abc";
        const char * cStr = [ocStr cStringUsingEncoding:NSUTF8StringEncoding];
        NSLog(@"oc得到c字符串:%s", cStr);
        
    //    *cStr='a';取*自然就是指第一个字符,为'a'
    ****************************************************
    类方法中不能访问实例变量和实例方法
    实例变量是对应类声明的对象的,不同的对象分别对应不同的实例变量,类方法是类直接调用的方法,若是访问实例变量的话,从道理上讲是没有意义的!
    ****************************************************
    ****************************************************
  • 相关阅读:
    毕业设计进度5(2月5日)
    毕业设计进度4(2月4日)
    Intellij IDEA 安装Scala插件 + 创建Scala项目
    中国HBase技术社区第一届Meetup资料大合集
    【大会PPT+直播回顾】HBaseCon亚洲2018峰会
    Java 中的锁原理、锁优化、CAS、AQS 详解!
    Reactor 反应堆设计模式
    IO模型
    浅析Reactor设计模式
    将IDEA工程代码提交到Github
  • 原文地址:https://www.cnblogs.com/hyuganatsu/p/NSString.html
Copyright © 2011-2022 走看看