·您现在的位置: 云翼网络 >> 文章中心 >> 网站建设 >> app软件开发 >> IOS开发 >> objective-c系列-NSString

objective-c系列-NSString

作者:佚名      IOS开发编辑:admin      更新时间:2022-07-23
C中没有字符串变量的概念
     只有一个字符串常量的概念
     即:   “abcd”
     在c中,用一个字符串指来指向一个内存地址,
     然后从该地址往后,遇到'\0'结束,这一段
     内存就表述为一个字符串
     char *s=地址;
     那么s就代表一个c字符串
     对c字符串符的处理有一套函数:
     strlen  求字符中长度,只算有效字符个数,不含'\0'
     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\n", 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\n",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'
****************************************************
类方法中不能访问实例变量和实例方法
实例变量是对应类声明的对象的,不同的对象分别对应不同的实例变量,类方法是类直接调用的方法,若是访问实例变量的话,从道理上讲是没有意义的!
****************************************************
****************************************************