【字符串】
【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