字符串创建
下面所有的方法都是对字符串的增删改查
什么是NSString
一个NSString对象就代表一个字符串(文字内容) 一般称NSString为字符串类
如何创建NSString对象?有几种方法创建一个NSString字符串
通过@""直接创建
// 如果通过@""创建字符串, 那么会将字符串放到常量区中
// 如果是字符串常量, 那么只要内容相同 , 不会重复创建
NSString *str1 = @"lnj";
通过alloc或者类工厂方法创建
如果是通过alloc或者类工厂方法创建, 那么会将字符串放到堆区中
NSString *str2 = [[NSString alloc] initWithString:@"lnj"];
NSString *str3 = [NSString stringWithFormat:@"lmj"];
字符串读写上
如何从文件中读取字符串?什么是绝对路径?编码的常用格式是什么?错误信息是如何读取的?
file: 文件路径,
encoding: 编码英文 iOS-5988-1 中文 GBK GBK2312 , 一般情况填写UTF-8
error: 如果读取错误, 会将错误信息保存到error中 ,如果读取正确, 就没有error = nil
注意: 以后在OC方法中但凡看到XXXofFile的方法, 传递的一定是全路径(绝对路径)
NSString *path = @"路径;
NSError *error = nil;
// 从文件中读取字符串
NSString *str = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];
if (error == nil) {
NSLog(@"str = %@", str);
}else
{
//localizedDescription 打印真正错误信息
NSLog(@"error = %@", [error localizedDescription]);
如何将字符串写入到文件中
NSString *str = @"iOS0601";
// atomically 如果传入YES, 字符串写入文件的过程中如果没有写完, 那么不会生成文件
// 如果传入NO, 字符串写入文件的过程中如果没有写完, 会生成文件
NSString *path2 = @"/Users/Desktop/abc.txt";
BOOL flag = [str writeToFile:path2 atomically:YES encoding:NSUTF8StringEncoding error:nil];
NSLog(@"flag = %i", flag);
字符串读写下(通过URL获取数据)
什么是URL
URL的全称是Uniform Resource Locator(统一资源定位符)
URL是互联网上标准资源的地址
互联网上的每个资源都有一个唯一的URL,它包含的信息指出资源的位置
根据一个URL就能找到唯一的一个资源
书写URL格式
URL = 协议头://主机地址/路径
如何创建URL
通过alloc 或者类工厂方法创建
NSURL *url = [NSURL URLWithString:@"file:///Users/LNJ/Desktop/str.txt"];
NSURL *url = [[NSURL alloc] initWithString:@"file:///Users/LNJ/Desktop/str.txt"];
通过文件路径创建(默认就是file协议的)
NSURL *url = [NSURL fileURLWithPath:@"/Users/LNJ/Desktop/str.txt"];
如何获取本地路径的信息?获取本地路径信息的方法有什么注意点
获取本地路径信息--fileURLWithPath
1.字符串保存路径
NSString *path = @"路径";
NSLog(@"url编码前: %@", path);
2.将路径中中文转换为UTF-8编码格式
path = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"url编码后: %@", path);
方法二:
1.字符串保存路径,如果访问本机的文件, 可以省略主机地址
NSString *path = @"file:///Users/xiaomage/Desktop/课堂共享/day17/note/lnj.txt";
NSLog(@"url编码前: %@", path);
2.将路径中中文转换为UTF-8编码格式
path = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSLog(@"url编码后: %@", path);
NSURL *url = [NSURL URLWithString:path];
3.获取本地路径的信息
NSURL *url = [NSURL fileURLWithPath:@"/Users/xiaomage/Desktop/课堂共享/day17/note/lnj.txt"];
NSError *error = nil;
NSString *str = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
if (error == nil) {
NSLog(@"str = %@", str);
}else{
NSLog(@"error = %@", [error localizedDescription]);
}
注意点:
URLWithString: 方法不支持中文,所以无法成功创建URL,必须先对路径字符串进行编码
fileURLWithPath: 方法支持中文,并且省略协议头,但是只能获取本地方法
如何获取网络路径的信息
获取网络路径的信息--URLWithString
NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
NSString *str = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
NSLog(@"str = %@", str);
如何将信息写入到指定文件
方法一:
NSString *str = @"lnj";
NSString *path = @"file:///Users/NJ-Lee/Desktop/未命名文件夹/abc.txt";
path = [path stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSURL *url = [NSURL URLWithString:path];
[str writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:nil];
方法二:
NSString *str = @"lnj";
NSString *path = @"/Users/xxx/Desktop/未命名文件夹/abc.txt";
NSURL *url = [NSURL fileURLWithPath:path];
[str writeToURL:url atomically:YES encoding:NSUTF8StringEncoding error:nil];
总结:
如果多次往同一个文件中写入内容,那么后一次的会覆盖前一次的
方法名中没有file,路径中要添加上file协议头,如果方法名中有file,路径中就不需要file协议头
字符串比较
NSString *str1 = @"abc";
NSString *str2 = @"ABC";
如何比较两个字符串的"内容"是否相同
BOOL flag = [str1 isEqualToString:str2];
NSLog(@"flag = %i", flag);
如何比较两个字符串的"地址"是否相同
flag = (str1 == str2);
NSLog(@"flag = %i", flag);
如何比较字符串的大小
答:使用方法compare:
// NSOrderedAscending 前面的小于后面的
// NSOrderedSame, 两个字符串相等
// NSOrderedDescending 前面的大于后面的
switch ([str1 compare:str2]) {
case NSOrderedAscending:
NSLog(@"str1小于str2");
break;
case NSOrderedSame:
NSLog(@"str1等于str2");
break;
case NSOrderedDescending:
NSLog(@"str1大于str2");
break;
default:
break;
}
如何忽略大小写进行比较
switch ([str1 caseInsensitiveCompare:str2]) {
case NSOrderedAscending:
NSLog(@"str1小于str2");
break;
case NSOrderedSame:
NSLog(@"str1等于str2");
break;
case NSOrderedDescending:
NSLog(@"str1大于str2");
break;
default:
break;
}
字符串搜索
如何判断字符串是以什么开头的?本质是什么
// 本质就是从字符串的第一个字符开始匹配, 只要不匹配就返回NO
if ([str hasPrefix:@"http://"]) {
NSLog(@"是一个URL");
}else
{
NSLog(@"不是一个URL");
}
如何判断字符串是否以什么结尾的?本质是什么
// 本质就是从字符串的最后一个字符开始匹配, 只要不匹配就返回NO
if ([str hasSuffix:@".gif"]) {
NSLog(@"动态图片");
}else{
NSLog(@"不是动态图片");
}
如何判断字符串中是否包含520本质是什么
NSString *str = @"abcd";
// 只要str中包含该字符串, 那么就会返回该字符串在str中的起始位置以及该字符串的长度
// location从0开始 , length从1开始
// 如果str中没有需要查找的字符串, 那么返回的range的length=0, location = NSNotFound
NSRange range = [str rangeOfString:@"lnj"];
// if (range.location == NSNotFound) {
if (range.length == 0){
NSLog(@"str中没有需要查找的字符串");
}else{
NSLog(@"str中有需要查找的字符串");
NSLog(@"location = %lu, length = %lu", range.location, range.length);
}
字符串截取
OC中的结构体,使用什么开头的方法创建
NSString *str = @"<head>Home</head>";
如何获取指定范围内的字符串
1.动态获取截取的起始位置
NSUInteger location = [str rangeOfString:@">"].location + 1;
2.动态获取截取的长度
// 注意:rangeOfString是从左至右的开始查找, 只要找到就不找了
NSUInteger length = [str rangeOfString:@"</"].location - location;
NSRange range = NSMakeRange(location, length);
NSString *newStr = [str substringWithRange:range];
NSLog(@"str = %@", str);
NSLog(@"newStr = %@", newStr);
如何截取字符串
<head>Home</head> --> Home</head> --> Home
<head>Home</head> --> <head>Home --> Home
NSUInteger location = [str rangeOfString:@">"].location + 1;
NSString *newStr = [str substringFromIndex:location];
NSLog(@"newStr = %@", newStr);
location = [newStr rangeOfString:@"</"].location;
// 改变了指针的指向, 并不是修改了原来的字符串
newStr = [newStr substringToIndex:location];
NSLog(@"newStr = %@", newStr);
字符串替换
了解字符串替换方法,和怎么填方法中的参数
如何替换字符串中的部分字符
//需求: 将&符号替换为/
NSString *str = @"http:&&www.520.com&img&ywc.gif";
// OccurrencesOfString: 要替换谁
// withString: 用谁替换
NSString *newStr = [str stringByReplacingOccurrencesOfString:@"&" withString:@"/"];
NSLog(@"newStr = %@", newStr);
如何对字符串首位进行处理
NSString *str = @"HTTP://www.520it.com/img/LNJ.GIF";
NSCharacterSet *set = [NSCharacterSet uppercaseLetterCharacterSet];
NSString *newStr = [str stringByTrimmingCharactersInSet:set];
NSLog(@"newStr = |%@|", newStr);
获取路径方法的本质
NSString *str = @"User/lnj/Desktop/ywc.txt.jpg";
如何判断是否是绝对路径
其实:本质就是判断字符串是否以/开头
if([str isAbsolutePath])
{
NSLog(@"是绝对路径");
}else{
NSLog(@"不是绝对路径");
}
如何获取文件路径中的最后一个目录
本质:就是获取路径中最后一个/后面的内容
NSString *newStr = [str lastPathComponent];
NSLog(@"%@", newStr);
如何删除文件路径中的最后一个目录
本质:就是删除最后一个/后面的内容, 包括/也会被删除
NSString *newStr = [str stringByDeletingLastPathComponent];
NSLog(@"%@", newStr);
如何给文件路径添加一个目录
本质:就是在字符串的末尾加上一个/ 和指定的内容
注意: 如果路径后面已经有了/, 那么就不会添加了
如果路径后面有多个/, 那么会自动删除多余的/, 只保留一个
NSString *newStr = [str stringByAppendingPathComponent:@"ywc"];
NSLog(@"%@", newStr);
如何获取路径中文件的扩展名
本质:就是从字符串的末尾开始查找., 截取第一个.后面的内容
NSString *newStr = [str pathExtension];
NSLog(@"%@", newStr);
如何删除路径中文件的扩展名
本质就是从字符串的末尾开始查找.,删除第一个.和.后面的内容
NSString *newStr = [str stringByDeletingPathExtension];
NSLog(@"%@", newStr);
如何给文件路径添加一个扩展名
本质:就是在字符串的末尾加上一个.和指定的内容
NSString *newStr = [str stringByAppendingPathExtension:@"jpg"];
NSLog(@"%@", newStr);
字符串转换
NSString *str = @"abc";
如何将将字符串转换为大写
NSString *newStr = [str uppercaseString];
NSLog(@"%@", newStr);
如何将字符串转换为小写
NSString *newStr2 = [newStr lowercaseString];
NSLog(@"%@", newStr2);
htpp://www.520.com/img/ywc.GIF;
如何将字符串的首字符转换为大写
NSString *newStr = [str capitalizedString];
NSLog(@"%@", newStr);
如何字符串与基本数据类型的转换
NSString *str1 = @"110";
NSString *str2 = @"120";
// str1 + str2; // 错误
int value1 = [str1 intValue];
int value2 = [str2 intValue];
NSLog(@"sum = %i", value1 + value2);
// 注意: 如果不是int,double,float,bool,integer,longlong这些类型就不要乱用
NSString *str3 = @"abc";
int value3 = [str3 intValue];
NSLog(@"value3 = %i", value3);
如何C语言字符串和OC字符串之间的转换
char *cStr = "ywc";
NSString *str = [NSString stringWithUTF8String:cStr];
NSLog(@"str = %@", str);
NSString *newStr = @"xxx";
constchar *cStr2 = [newStr UTF8String];
NSLog(@"cStr2 = %s", cStr2);
NSMutalbleString 基本概念
NSMutableString和NSString的区别
NSString是不可变的, 里面的文字内容是不能进行修改的
NSMutableString是可变的, 里面的文字内容可以随时更改
NSMutableString能使用NSString的所有方法
什么是可变字符串?什么是不可变字符串
不可变字符串:指的是字符串在内存中占用的存储空间固定,并且存储的内容不能发生变化
可变字符串:指的是字符串在内存中占用的存储空间可以不固定,并且存储的内容可以被修改
NSMutalbleString常用方法
对可变字符串增删改查
NSMutableString *strM = [NSMutableString stringWithFormat:@"www.520.com.520"];
在字符串后面添加一段字符串
[strM appendString:@"/image"];
[strM appendFormat:@"/age is %i", 10];
NSLog(@"strM = %@", strM);
如何删除字符串中的520
技巧: 在开发中, 我们经常利用rangeOfString和deleteCharactersInRange方法配合起来删除指定的字符串
先查找出520在字符串中的位置
NSRange range = [strM rangeOfString:@"520"];
删除520
[strM deleteCharactersInRange:range];
NSLog(@"strM = %@", strM);
如何在520前面插入love这个单词
// insertString : 需要插入的字符串
// atIndex: 从哪里开始插入
NSRange range = [strM rangeOfString:@"520"];
[strM insertString:@"love" atIndex:range.location];
NSLog(@"strM = %@", strM);
如何将字符串中的520替换为530
注意: 如果是调用NSString的字符串替换方法, 不会修改原有字符串, 而是生产一个新的字符串
NSString *newStr =[strM stringByReplacingOccurrencesOfString:@"520" withString:@"530"];
注意:
一般情况下OC方法要求传入一个参数如果没有*, 大部分都是枚举
一般情况下如果不想使用枚举的值, 可以传入0, 代表按照系统默认的方式处理
OccurrencesOfString: 需要替换的字符串
withString: 用什么替换
options: 替换时的搜索方式
range: 搜索的范围
返回值: 代表替换了多少个字符串
NSUInteger count = [strM replaceOccurrencesOfString:@"520" withString:@"530" options:0 range:NSMakeRange(0, strM.length)];
NSLog(@"strM = %@", strM);
NSLog(@"count = %lu", count);
NSMutalbleString练习
拼接字符串有几种方法?
需求: 将3个520拼接在一起, 中间用空格隔开520 520 520
NSString *subStr = @"520";
方法一:
// 520-
NSString *newStr = [subStr stringByAppendingString:@" "];
// 520-520
newStr = [newStr stringByAppendingString:subStr];
// 520-520-
newStr = [newStr stringByAppendingString:@" "];
// 520-520-520
newStr = [newStr stringByAppendingString:subStr];
方法二:
注意: 在开发中如果需要对字符串进行频繁的操作, 不要使用不可变的字符串
NSString *newStr = [subStr stringByAppendingString:@" "];;
for (int i = 0; i < 2; ++i) {
newStr = [newStr stringByAppendingString:subStr];
newStr = [newStr stringByAppendingString:@" "];
}
// newStr = [newStr stringByReplacingCharactersInRange:NSMakeRange(newStr.length -1 , 1) withString:@""];
newStr = [newStr stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
NSLog(@"newStr = |%@|", newStr);
方法三:
// 创建一个空得字符串
NSMutableString *strM = [NSMutableString string];
for (int i = 0; i < 3; ++i) {
// 1.添加一个520
[strM appendString:subStr];
// 2.添加一个空格
[strM appendString:@" "];
}
[strM deleteCharactersInRange:NSMakeRange(strM.length - 1, 1)];
NSLog(@"strM = |%@|", strM);