3大数据结构类之——字符串(一)

前言

OC程序必须依托于Foundation框架,Foundation框架其实就是一个类库。它包含了许多iOS/OS X开发中所必须的类。其中有3个数据结构类:字符串、数组和字典。本文就字符串类做相关讨论。

oc中的字符串 , 于给ios/mac 下应 程序服务.往后的ios/OS X应 程序开发,都使 oc字符串。

一.创建一个字符串对象:

 //字面量语法,推荐这种语法,简单直观
        //1.注意类名之后跟着*说明str1是一个指针,它指向"hello world!"(对象)所在的内存,为什么加@,@表示它是一个对象
        NSString * str1 = @"hello world!";
        //%p用来打印地址,%@用以打印对象
        //注:本例打印的地址是笔者电脑上的地址,不同的地址可能不一样
        NSLog(@"str1(%p) : %@",str1,str1);// str1(0x100001040) : hello world!
        
        //2.创建一个NSString类的空的对象
        NSString * str2 = [[NSString alloc]init];
        //
        //str2 = @"hello world!";//str2(0x100001040) : hello world!
        //注意到str1和str2的地址是一样的了么?为什么呢?因为@"hello world!"这个对象的地址只会被分配一次,在数据区。
        str2 = @"How are you!";
        NSLog(@"str2(%p) : %@",str2,str2);
        
        //3.通过实例化方法创建字符串对象
        NSString * str3 = [[NSString alloc]initWithString:@"hello world"];
        NSLog(@"str3(%p) : %@",str3,str3);//str3(0x1000010c0) : hello world
        //str3和str1都是指向hello world 的对象,为什么地址不一样呢?因为alloc会在堆区为对象申请一块空间
        
        //4.根据C语言字符串创建OC字符串
        //4.1通过构造方法
        const char * p = "Come on!";
        NSString *str4 = [[NSString alloc]initWithCString:p encoding:NSUTF8StringEncoding];
        NSLog(@"str4(%p) : %@",str4,str4);//str4(0x100109520) : Come on!
        //4.2通过类方法创建对象
        NSString * str5 = [NSString stringWithUTF8String:p];
        NSLog(@"str5(%p) : %@",str5,str5);//str5(0x1005003b0) : Come on!
        //创建格式化的字符串
        NSString *str6 =[NSString stringWithFormat:@"%@ %@",str1,str2];
        NSLog(@"str6(%p) : %@",str6,str6);//str6(0x100700120) : hello world! How are you!
        
        //通过类方法创建,str5、str6都是通过类方法创建的字符串
        NSString * str7 = [NSString stringWithString:@"hello world"];

二.字符串常用方法

1.比较字符串

1.1是否相等

//isEqualToString方法判断两个字符串是否相等,相等返回1,否则返回0
    NSString * str1 = @"this is a string";
    NSString * str2 = @"this is a string";
    BOOL ret = [str1 isEqualToString:str2];
    if(ret){
        NSLog(@"str1 = str2");
    }else{
        NSLog(@"str1 ≠ str2");
    }
    //str1 = str2,如果对其中一个字符串稍作改动就会得到str1 ≠ str2

1.2比较字符串大小

//compare方法比较大小,返回值是一个枚举typedef NS_ENUM(NSInteger, NSComparisonResult) {NSOrderedAscending = -1L, NSOrderedSame, NSOrderedDescending};分别为升序,相等、降序
        NSString *astring01 = @"This is a String!";
        NSString *astring02 = @"This is a String!";
        BOOL result = [astring01 compare:astring02] == NSOrderedSame;//0
        NSLog(@"result:%d",result);// result:1,说明是相等的,其他两种就不一一的试了,原理是一样的

1.3不考虑大小写比较字符串大小,

//caseInsensitiveCompare方法
        NSString *astring1 = @"this is a String!";
        NSString *astring2 = @"This is a String!";
        BOOL result = [astring1 caseInsensitiveCompare:astring2] ==  NSOrderedSame;
    NSLog(@"result:%d",result);//result:1

2.大小写转换

    //先得到一个要转换的字符串
    NSString * string = @"This is A String";

    //2.1小写转换大写
    NSString *lString = [string uppercaseString];
    NSLog(@"lString = %@",lString);//LString = THIS IS A STRING
    //那么原来的字符串有没有变化呢?
    NSLog(@"string = %@",string);//string = This is A String
    //这说明原来的字符串不会发生变化,LString是一个新的字符串

    //2.2大写转小写
    NSString *sString=[string lowercaseString];
    NSLog(@"sString = %@",sString);//sString = this is a string
    //2.3首字母大写
    NSString *cString = [sString capitalizedString];
    NSLog(@"cString = %@",cString);//cString = This Is A String

3.字符串搜索

//rangeOfString
//在已知字符串(父串)中查找某个单词或者某一句话(子串)的范围
NSString *fatherString = @"I'm a iOS programmer";
NSString *sonString = @"iOS";
//定义一个结构体NSRange,range表示子串在父串中的范围(起始位置,和长度)
//注意这个方法的两个参数分别是父串、子串
NSRange range = [fatherString rangeOfString:sonString];
NSUInteger location = range.location;
NSUInteger length = range.length;
NSLog(@"%lu,%lu",location,length);//当不存在子串时,location的值是一个非常大的值,笔者电脑上是9223372036854775807,length的值为0
//输出结果6,3;表示是子串(iOS)在父串中的位置是下标为6开始,持续3个长度,注意在计算机系统中的下标都是从0开始的

4.抽取子串,必须有父串

//方法1.从开头位置开始,截取到某个位置为止:substringToIndex
NSString *fatherString = @"Hello , I'm a iOS programmer!";
NSString * string01 = [fatherString substringToIndex:12];
NSLog(@"string01 = %@",string01);//string01 = Hello , I'm ,注意最后有一个空格“a”是第12个位置上的字符,可见这个方法是不包括给定位置的

//方法2.从指定为止开始,截取到最后,substringFromIndex,这个方法是包括指定位置的
NSString * string02 = [fatherString substringFromIndex:12];
NSLog(@"string02 = %@",string02);//string02 = a iOS programmer!

//方法3.截取指定范围的字符串substringWithRange,这个方法的参数是一个NSRange,前面说了,它是一个结构体,怎么构造一个结构体呢?
//OC中凡是结构体,都有对于的NSMake方法可以构造
NSString * string03 = [fatherString substringWithRange:NSMakeRange(5, 10)];
NSLog(@"string03 = %@",string03);//string03 =  , I'm a i

5.判断字符串的前缀、后缀

//这个方法在后期的文件操作中经常用到
//比如有个"iOS.txt"文件
NSString * pathString = @"iOS.txt";
//- (BOOL) hasPrefix: (NSString *)  aString;
//判断前缀是否是iOS,返回只是一个BOOL类型
//三目运算符?:,?之前的条件位置,执行:之前的语句,否则执行:后面的语句
[pathString hasPrefix:@"iOS"]?NSLog(@"YES"):NSLog(@"NO");//YES
//判断后缀+ (BOOL) hasSuffix: (NSString *)  aString;
[pathString hasSuffix:@"txt"]?NSLog(@"YES"):NSLog(@"NO");//YES

字符串先告一段落,本篇讲的是不可变字符串,当然还有其他方法,笔者不一一赘述了,有兴趣的可以自己去研究一下,下一篇将讨论可变字符串可变字符串


喜欢的话,帮忙点一下喜欢,谢谢!
如果有错误之处或者偏差,还请斧正!
欢迎大家留言提问,技术要交流才能更快成长!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • 大纲 26.Protocol-协议 27.delegate-代理 28.Foundation框架介绍 29.NSS...
    天天想念阅读 1,353评论 0 2
  • OC中的类分为可变和不可变。下表列出了Foundation框架中主要的可变类和不可变类: 种类 不可变类 可变类 ...
    陈_振阅读 510评论 0 0
  • 作为中国最重要的节日春节,在短短半个月后就要到达了,对我们每个华夏儿女来说,春节是最重要的节日,没有之一,每当我们...
    更好时代阅读 171评论 0 0
  • 晃眼一过,四年的大学生涯即将结束。经历些事情后,我逐渐发现生活的过程就是在追求各种各样的平衡,时间的平衡,金钱的平...
    矛盾纠结体阅读 259评论 0 1