一、字符串操作室程序开发中比较常见的,例如创建字符串、获取字符串长度和子字符串、字符串的比较、替换、拼接、分割等。
1. 创建字符串
C语言中创建方式: 字符串是用字符数组来表示
// C语言中创建
char *s = "A string"; // 改字符数组的每一个字符是一个ASCII字符,并以0值表示字符串的结尾。
OC中创建方式
// oc中创建
NSString *str1 = @"A String";
NSLog(@"st1:%@", str1);
NSString *str2 = [[NSString alloc] init];
str2 = @"A String";
NSLog(@"st2:%@", str2);
[str2 release];
NSString *str3 = [[NSString alloc] initWithString:@"A String"]; // 使用初始化字符串的方式,如使用带格式的
NSLog(@"st3:%@", str3);
[str3 release];
NSString *str4 = [[NSString alloc] initWithUTF8String:"A String"];
NSLog(@"st4:%@", str4);
[str4 release];
NSString *str5 = [[NSString alloc] initWithFormat:@"my age is %i and height is %.2f", 19, 1.55];
NSLog(@"st5:%@", str5);
// 要是希望能够自动释放,则可以使用NSString类的类方法 stringWithFormat:, 其使用方式与实例方法initWithFormat: 基本一样
NSString *str6 = [[NSString alloc] stringWithFormat:@"my age is %i and height is %.2f", 19, 1.55];
[str5 release];
与C语言字符串不同,他的每个字符是16位Unicode字符。NSString是继承自NSOject,所以字符串可以用在所有需要对象的地方。
不需要内存管理 用stringWith 代替 initWith
NSString *str6 = [NSString stringWithString:@"A String"];
NSLog(@"st6:%@", str6);
* OC中创建方式还有几个重要的方法:
void stringCreat_2() {
// 从文本读取文件
NSString *path = @"/Users/shumei/Desktop/test.txt";
// 异常机制
NSError *error;
// 错误时候就会给error 进行赋值
NSString *str1 = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];
// 为什么下面的会出现线程错误
if (error != nil) { // 返回的值不为空,也就是真;则表示失败
NSLog(@"读取文件失败 %@", error);
} else {
NSLog(@"读取文件成功 %@", str1);
}
// 访问本地文件
NSURL *url = [NSURL URLWithString:@"file:///Users/shumei/Desktop/test.txt"];
NSString *str2 = [NSString stringWithContentsOfURL:url encoding:(NSUTF8StringEncoding) error:nil];
NSLog(@"str2:%@", str2);
// 访问网络
NSURL *url2 = [NSURL URLWithString:@"http://www.baidu.com"];
NSString *str3 = [NSString stringWithContentsOfURL:url2 encoding:NSUTF8StringEncoding error:nil];
// NSLog(@"%@", str3);
}
2. 字符串的各种操作
1). 字符串比较
字符串的比较是最常见的操作。对于C语言字符串,C标准库中提供了strcmp方法。下面看看Cocos字符串的比较
== 这个表示的是两个字符串是否为同一个对象;而不是比较两个字符串的内容是否相等。用isEqualToString 实例方法才是比较内容
void compare() {
// 使用== 比较
NSString *hello = @"Hello";
NSString *hello1 = [NSString stringWithFormat:@"%@", hello];
NSLog(@"hello: %@, %p", hello, hello);
NSLog(@"hello1: %@, %P", hello1, hello1);
NSLog(@"hello == hello1 ? %@", hello == hello1? @"YES" : @"NO"); // 输出结果是NO
NSLog(@"hello isEqualToString hello1 ? %@", [hello isEqualToString: hello1]? @"YES" : @"NO"); // 输出结果是YES
// 检测字符窜内容是否相同
BOOL result = [@"abc" isEqualToString:@"abc"];
BOOL result1 = [@"adc" isEqualToString:@"Abc"];
NSLog(@"result: %i result1: %i", result, result1 );
NSComparisonResult result2 = [@"abc" compare:@"Abc"];
if (result2 == NSOrderedSame) { // 一样大
NSLog(@"两边的字符串一样大");
}
if (result2 == NSOrderedAscending) { // 前者小于后者
NSLog(@"右边大于左边");
}
if (result2 == NSOrderedDescending) { // a = A + 32; 降序
NSLog(@"左边大于右边");
}
}
2). 改变大小写
void caseTest() {
NSString *str = @"Hello World, hello world";
// 装换成大写
NSString *a = [str uppercaseString];
NSLog(@"大写:%@", a);
// 装换成大写
NSString *b = [str lowercaseString];
NSLog(@"大写:%@", b);
// 首字母变大写,其他字母变小写
NSLog(@"首字母变大写: %@", [@"hELLO" capitalizedString]);
}
3). 字符串搜索
void search() {
NSString *str = @"123456.txt";
NSLog(@"是否以22开头:%i", [str hasPrefix:@"22"]);
NSLog(@"是否以txt开头:%i", [str hasSuffix:@"txt"]);
// NSRange是一个typedef的枚举类型 所以定义的时候不需要加*
NSRange range = [str rangeOfString:@"345"];
if (range.location == NSNotFound) {
NSLog(@"不能找到");
} else {
NSLog(@"找到的范围是: %@", NSStringFromRange(range));
}
// 从尾部开始搜索字符串
NSRange range1 = [str rangeOfString:@"345" options:NSBackwardsSearch];
NSLog(@"找到的range1范围是: %@", NSStringFromRange(range1));
// 指定范围进行搜索
NSRange range2 = {0, 5};
NSRange range3 = [str rangeOfString:@"34" options:NSBackwardsSearch range:range2];
NSLog(@"找到rang3的范围是: %@", NSStringFromRange(range3));
//NSLog(@"%i", range2);
}
4). 提取字符串(截取)
void subString() {
NSString *str = @"123456789";
// 截取789
// substringFromIndex 意思是从索引端开始截取到尾部 包括索引位置
NSString *str1 = [str substringFromIndex:6];
NSLog(@"%@", str1);
// substringToIndex 意思是从头部开始截取到索引端 不包括头部
NSString *str2 = [str substringToIndex:6];
NSLog(@"%@", str2);
// substringWithRange 意思是从头部开始截取到索引端 不包括头部
NSRange range = NSMakeRange(0, 3); //
NSString *str3 = [str substringWithRange:range];
NSLog(@"%@", str3);
// 分割
NSString *str4 = @"1,2,3,4,5,6";
NSLog(@"str4: %@", str4);
NSString *str5 = @"1, 2, 3, 4, 5, 6";
NSLog(@"str5: %@", str5);
NSArray *array = [str4 componentsSeparatedByString:@","];
NSArray *array1 = [str5 componentsSeparatedByString:@","];
// NSArray *array1 = [str5 componentsSeparatedByString:@", "]; // 这样的就以array一样了
// NSArray *array1 = [str5 componentsSeparatedByString:@","]; // 这样的就 "1, 2, 3, 4, 5, 6"
NSLog(@"array: %@", array);
NSLog(@"array1: %@", array1); // 打印出来的结果格式不一样为什么?
}
5). 字符串与字符串数组的转换以及路径问题
void pathTest() {
NSMutableArray *components = [NSMutableArray array]; // NSMutableArray 是可变数组
[components addObject:@"Users"];
[components addObject:@"shumei"];
[components addObject:@"Desktop"];
// 将数组中的所有字符串拼接成一个路径
NSString *path = [NSString pathWithComponents:components];
NSLog(@"%@", path);
// 将路径分割成字符串
NSArray *cmps = [path pathComponents];
NSLog(@"%@", cmps);
// 判断是否为绝对路径(依据是最开始有没有/)
path = @"/user/shumei/desktop";
NSLog(@"%i", [path isAbsolutePath]);
NSLog(@"最后一个目录是 :%@", [path lastPathComponent]);
// 删除最后一个目录
NSLog(@"%@", [path stringByDeletingLastPathComponent]);
// 在最面拼接一个目录
NSLog(@"%@", [path stringByAppendingPathComponent:@"shuzi"]);
}
6). 字符串拓展名处理
void extension() {
NSString *str = @"/user/shumei/text.txt";
NSLog(@"拓展名: %@", [str pathExtension]);
// 删除拓展名
NSLog(@"%@", [str stringByDeletingPathExtension]);
// 在拓展名后面添加文件,直接添加一个. 并不会做什么判断
NSLog(@"%@", [str stringByAppendingPathExtension:@"nihao"]);
}
7). 其他
void other() {
NSString *str = @"1";
int a = [str intValue];
NSLog(@"a=%i", a);
// 求字符串长度 计算字数,不是计算字符数
NSUInteger len = [@"你好么" length];
NSLog(@"长度是:%zi", len);
// 返回C语言中的字符串
const char *s = [@"abc" UTF8String];
NSLog(@"%s", s);
}
3. 可变字符串
void stringCreate_3() {
// 指定字符串长度
NSMutableString *str = [[NSMutableString alloc] initWithCapacity:10];
// 设置字符串内容
[str setString:@"123455"];
NSLog(@"字符串内容是: %@", str);
// 拼接字符串
[str appendString:@"678"];
NSLog(@"拼接后字符串内容是: %@", str);
// 这个也是拼接字符串
[str appendFormat:@"age is %i and len is %i", 22, 22];
NSLog(@"再次拼接后字符串内容是: %@", str);
// 替换字符串,将现有的字符串内容重置为另一个字符串内容
NSRange range = [str rangeOfString:@"len"];
[str replaceCharactersInRange:range withString:@"haha"];
NSLog(@"替换后字符串内容是: %@", str);
// 插入字符串
[str insertString:@"abcdef" atIndex:2];
NSLog(@"插入内容后字符串内容是: %@", str);
// 删除字符串 也可以删除指定范围的字符串
range = [str rangeOfString:@"abcd"];
[str deleteCharactersInRange:range];
NSLog(@"删除之后字符串内容是: %@", str);
NSRange range1 = NSMakeRange(0, 2);
[str deleteCharactersInRange:range1];
NSLog(@"再次删除之后字符串内容是: %@", str);
}