IOS-OC-字符串+

【字符串】

【OC的基础类库是Foundation类库,离开这个库,不可能写出OC的程序。这个类库中导入(import)了C的常用的基础的头文件。】

Foundation类库,提供了三个基础的数据结构,是三个类。
【字符串】 【数组】 【字典】

一.字符串对象的声明

int main(int argc, const char * argv[])
{
    
    @autoreleasepool {
        
        NSString * str1 = @"我是OC字符串!";
        //当我们写出表达式@"我是OC字符串!",就是告诉编译器,创建一个字符串对象。这个表达式的值,是该对象地址。
        
        //用一个字符串,创建另一个字符串
        NSString * str2 = [[NSString alloc] initWithString:str1];
        
        //将C字符串,转换成OC字符串
        NSString * str3 = [[NSString alloc] initWithUTF8String:"aoe,iuv"];
        
        //使用格式符,创建字符串
        NSString * str4 = [[NSString alloc] initWithFormat:@"hello %d %c %.2f", 5, 'A', 3.1415926];
        
        //OC字符串不能用printf输出
        //但是遗憾的是OC没有一个从终端读取数据的方法,需要使用scanf读取C字符串,再转成OC字符串。
        NSLog(@"%@", str1);
        NSLog(@"%@", str2);
        NSLog(@"%@", str3);
        NSLog(@"%@", str4);
        
        
        //每个init方法,对应一个stringWith的类方法
        
        NSString * str5 = [NSString stringWithString:str1];
        NSString * str6 = [NSString stringWithUTF8String:"hello world!"];
        NSString * str7 = [NSString stringWithFormat:@"%d %c %s", 123, 'T', "678"];
       
        NSLog(@"%@", str5);
        NSLog(@"%@", str6);
        NSLog(@"%@", str7);
    }
    return 0;
}

二.编外方法

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        NSString * str1 = @"12345.6";
        
        //字符串转数字
        int ret = [str1 intValue];
        long long ret2 = [str1 longLongValue];
        double ret3 = [str1 doubleValue];
        NSInteger ret4 = [str1 integerValue];
        NSLog(@"%d", ret);
        
        //OC字符串转C字符串
        const char * p = [@"aoeiuv" UTF8String];
        NSLog(@"%s", p);
    }
    return 0;
}

//字符串转数字,浮点等方法      (atoi)
int ret = [str1 intValue];
long long ret2 = [str1 longLongValue];
double ret3 = [str1 doubleValue];
NSInteger ret4 = [str1 integerValue];

//OC字符串转C字符串
const char * p = [@"aoeiuv" UTF8String];

练习:
1.已知有两个字符串NSString * str1 = @“hello” NSString * str2 = @“world”,将两个字符串拼接到一起,中间用空格分开

//第二题是难题

2.输入两个表示数字的C字符串,求出两个数字的和

@implementation Quest ion
- (void)question
{
    char buf1[20];
    char buf2[20];
    
    scanf("%s %s",buf1,buf2);
    
    double value = [[NSString stringWithUTF8String:buf1] doubleValue] + [[NSString stringWithUTF8String:buf2] doubleValue];
    NSString *str = [NSString stringWithFormat:@"%.2f",value];
    NSLog(@"%@",str);
}
@end

三.字符串操作方法

【注】NSString对象是不可修改的。

1.返回字符串的长度

NSUInteger len = [str length];

2.返回单个字符

unichar c = [str characterAtIndex:3];

3.比较两个字符串的大小关系

BOOL ret = [str1 isEqualToString:str2];
``
BOOL值介绍
另一种方法

NSComparisonResult ret2 = [str1 compare:str2];

int main(int argc, const char * argv[])
{

@autoreleasepool {
    
    NSString * str1 = @"abc";
    NSString * str2 = @"abd";
    
    //比较两个字符串是否相等
    BOOL ret = [str1 isEqualToString:str2];
    if (ret == YES) {
        NSLog(@"两字符串相等");
    }else{
        NSLog(@"两字符串不等");
    }

    //比较两个字符串的大小关系
    NSComparisonResult ret2 = [str1 compare:str2];
    
    if (ret2 == NSOrderedAscending) {
        NSLog(@"右边大");
    }else if (ret2 == NSOrderedSame){
        NSLog(@"相等");
    }else if (ret2 == NSOrderedDescending){
        NSLog(@"左边大");
    }
    
    /*
     BOOL b = YES;       //表示真 1
     b = NO;             //表示假 0
     
     while(YES){
     
     }
     */
}
return 0;

}


4.查找子串的位置和范围

NSRange range = [str rangeOfString:@"粉刷"];

int main(int argc, const char * argv[])
{

@autoreleasepool {
    
    //如果字符串A的部分和字符串B整体相同,则称B为A的子串,A为B的父串
    //如父串@"1234567890" 子串@"345"
    
    NSString * str = @"我是一个粉刷匠";
    //在父串中查找子串第一次出现的范围
    NSRange range = [str rangeOfString:@"粉刷"];
    
    if(range.location == NSNotFound){
        NSLog(@"not found");    //没找到
    }else{
        NSLog(@"(%lu, %lu)", range.location, range.length);
        //如果找到了,打印起点和长度
    }
}
return 0;

}

5.子串的提取

define SHOW(a) NSLog(@"%@", a)

int main(int argc, const char * argv[])
{

@autoreleasepool {
    
    NSString * str = @"0123456789";
    
    //提取父串的一部分,生成新的字符串
    NSString * subStr1 = [str substringToIndex:5];
    //从父串第0个字符提取到第5个字符,不包括第5个(0--4),生成新字符串,创建对象,返回新字符串地址。
    //【开区间】
    SHOW(subStr1);
    
    NSString * subStr2 = [str substringFromIndex:5];
    //从第5个字符开始提取到字符串尾,包括第5个,生成新字符串,返回地址。
    //【闭区间】
    SHOW(subStr2);
    
    NSRange range = {5, 4};
    //范围是起点和长度而非起点和终点
    NSString * subStr3 = [str substringWithRange:range];
    //根据制定范围,提取子串,生成新串,返回地址
    SHOW(subStr3);
}
return 0;

}

// 练习
3.已知字符串NSString * str2 = @“I love Beijing!”;
找出love的范围
  • (void)question3;
    NSRange range = [str rangeOfString:@"粉刷"];
4.已知字符串NSString * str3 = @“I hate Beijing!”;
提取从第3个字符,提取到第5个字符。
  • (void)question4;
    NSString * subStr3 = [str substringWithRange:range];

#define MIN(x,y) [if (x>y) {return x;}else{return y;}]
四.可变字符串
NSMutableString 继承自 NSString
1.凡是NSString的方法,NSMutableString都能用
2.凡是传参需要传入NSString * 传入NSMutableString *也行

int main(int argc, const char * argv[])
{

@autoreleasepool {
    
    NSMutableString * str1 = [[NSMutableString alloc] initWithString:@"hello world!"];
    NSMutableString * str2 = [NSMutableString stringWithUTF8String:"123456"];
    
    //禁止用下述方法创建可变字符串 @"我是不可变字符串" 这句表达式返回一个不可以变字符串的地址
    //        NSMutableString * str3 = @"我是不可变字符串";
    
}
return 0;

}

【专有方法】
#import <Foundation/Foundation.h>

#define SHOW(a) NSLog(@"%@", a)
#define RESET [str setString:@"0123456789"]

//还原字符串

int main(int argc, const char * argv[])
{

@autoreleasepool {
    NSMutableString * str = [[NSMutableString alloc] init];
    //创建空字符串 @"" 字符串对象存在,但是里面有0个字符
    
    // 重置字符串内容
    // 因为堆空间可以改变大小,无需考虑预留空间问题
    [str setString:@"0123456789"];
    SHOW(str);
    [str setString:@"XXXXXXXX"];
    SHOW(str);

    RESET;
    //追加 相当于strcat
  //再最后添加字符串
    [str appendString:@"9876543210"];
    SHOW(str);
   从字符串最后 拼接
    [str appendFormat:@"%d %c %.2f", 34, 'T', 2.34];
    SHOW(str);
    
    RESET;
    //插入
    [str insertString:@"ABC" atIndex:3];
    //将插入的字符串插入到第3个字符的位置,插入之后,‘A’将成为第3个字符。原字符串中第3及以后字符向后移。
    SHOW(str);
    [str insertString:[NSString stringWithFormat:@"%.2f", 3.14] atIndex:3];
    SHOW(str);

    RESET;
    //删除指定范围的字符
    NSRange range = {5, 4};
    [str deleteCharactersInRange:range];
    SHOW(str);
    
    
    RESET;
    NSRange range = {5, 4};
    //将制定范围内的字符替换为新的子串,替换掉的字符和替换上去的字符长度可以不同。
    [str replaceCharactersInRange:range withString:@"XXXXXXXXXXXXXXX"];
    SHOW(str);
    
}
return 0;

}

1.重置字符串内容

[str setString:@"0123456789"];

2.增 append  insert

[str appendString:@"9876543210"];
[str appendFormat:@"%d %c %.2f", 34, 'T', 2.34];
[str insertString:@"ABC" atIndex:3];

3.删 delete

[str deleteCharactersInRange:range];

4.改 replace

[str replaceCharactersInRange:range withString:@"XXXXXXXXXXXXXXX"];

5.查 rangeOfString:











作业:
用了替换

1.将可变字符串@"When I was young, I loved a girl in neighbor class."中,从young提取到girl。替换成@"a teacher, I rather to teach student "。
用了if比较
2.从字符串@"Welcome to Bejing!",中查找Beijing的范围。
3.从字符串@"Welcome to Bejing!", 中提取第3到第10个字符,生成字符串。

// NSRange range = [strFour rangeOfString:@"young, I loved a girl"];
4.将字符串@"When I was young, I loved a girl in neighbor class."中,从young提取到girl。但是不许数。

5.将任意输入的数字,转换成字符串。
如 125 ---》 @"125"      scanf
6.将两个字符串
NSString * str1 = @"123";
NSString * str2 = @"abc";
拼接成一个完整的字符串。

7.不使用initWithUTF8String:将任意输入的C字符串,转成OC字符串。

用stringWithString

8.在字符串@"price:"后面追加一个从终端输入的任意浮点数,生成新字符串。要求保留两位小数。


9.(拓展)
编写一个分数类:
@interface Fraction : NSObject {
    int _numerator; //分子
    int _denominator; // 分母
}
//初始化方法
- (id)initWithNumerator:(int)numerator andDenominator:(int)denominator;

//setter方法
- (void) setNumerator:(int)newNumerator;
- (void) setDenominator:(int)newDenominator;

//getter方法
- (int) numerator;
- (int) denominator;

// 同时设置分子 分母
- (void) setNumerator:(int)newNumerator andDenominator:(int)newDenominator;

// 当前分数 + fraction2 (包含 + - * /)
- (void) addFraction:(Fraction *)fraction2;
- (void) subFraction:(Fraction *)fraction2;
- (void) mulFraction:(Fraction *)fraction2;
- (void) divFraction:(Fraction *)fraction2;

// 约分
- (void) reductionOfFraction;

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

推荐阅读更多精彩内容