【iOS】NSString的获取,判断,转换,重组,文件读写

版权声明:本文为博主原创,如需转载请注明出处。

1 NSString 类

  • Foundation框架,苹果公司提供给我们的工具箱
  • 许多的类,(属性,方法)
  • 闭源
  • Foundation中的所有的类文件都是以NS开头,方便统一使用
  • NSObject(基类),NSString
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#import <Foundation/Foundation.h>

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

@autoreleasepool {

// char * = "asdfg";
//1.创建字符串的方式
NSString * str = @"adf";//常量,一旦创建完成就不能够在改变

NSLog(@"%@",str);

//2.new alloc init
NSString * str1 = [NSString new];
NSString * str2 = @"ffff";//[[NSString alloc] initWithString:@"ffff"];
NSString * str3 = [NSString stringWithFormat:@"%@,%@",@"a",@"b"];

char * c = "www";
NSString * str4 = [[NSString alloc] initWithCString:c encoding:nil];

NSLog(@"str2 %@",str2);

NSLog(@"str4 %@",str4);

}
return 0;
}

2 字符串的获取

2.1 获取字符串的长度

1
2
3
NSString * str = @"abcd";
NSUInteger length = [str length]; //str.length;
NSLog(@"字符串长度 %lu",length);

2.2 根据索引获得单个字符

1
2
3
4
5
NSString * str2 = @"www.yoferzhang.com";
//如果你给定的索引值,超出了字符串的长度,就会导致异常Range or index out of bounds
//如果你给入的是一个负数那么获得的值就是一个乱码
unichar c = [str2 characterAtIndex:2];//索引值是从 0 开始的
NSLog(@"获得字符 %c",c);

2.3 根据索引获得字符串的一个子串

1
2
3
4
5
6
7
8
9
10
NSString * str3 = @"www.yoferzhang.com";
//substringFromIndex 从给定的索引开始(包含该索引位置)截取到字符串末尾
NSString * tmpStr = [str3 substringFromIndex:3];
NSLog(@"substringFromIndex %@ ",tmpStr);

//substringToIndex截取字符串到给定索引的位置结束,(不包含该索引位置);
NSString * tmpStr2 = [str3 substringToIndex:3];
NSLog(@"substringToIndex %@",tmpStr2);

NSLog(@"str3 %@",str3);

2.4 截取字符串的某一段

1
2
3
4
5
NSRange rang = {4,6};
//location (起始索引的位置,包含该索引) length(要截取的长度)
NSString * tmpStr3 = [str3 substringWithRange:rang];

NSLog(@"substringWithRange %@",tmpStr3);

2.5 获得一个字符串的索引位置

1
2
3
4
5
6
7
8
9
10
11
12
NSString * tmpStr4 = @"yoferzhang";//@"yoferzhang";
NSRange tmpRange = [str3 rangeOfString:tmpStr4];
//可以使用NSStringFromRange 把一个Range结构体转换成字符串
// NSLog(@"location = %d,length = %d",tmpRange.location,tmpRange.length);
//NSNotFound 没有找到
if (tmpRange.location == NSNotFound)
{
NSLog(@"tmpStr4 不在 Str3中");
}else
{
NSLog(@"rangeOfString %@",NSStringFromRange(tmpRange));
}

2.6 获得一个字符串索引范围

1
2
3
4
5
6
7
8
9
10
11
12
13
int main(int argc, const char * argv[])
{

@autoreleasepool {

//6.获的一个字符串索引范围
NSRange tmpRange2 = [str3 rangeOfString:@"yoferzhang" options:NSCaseInsensitiveSearch];

NSLog(@"rangeOfString1 %@",NSStringFromRange(tmpRange2));

}
return 0;
}

3 字符串的判断

3.1 判断字符串是否为空

1
2
3
4
5
NSString  * str = @"";
if (str == nil || str.length == 0)
{
NSLog(@"字符串为空");
}

3.2 判断字符串是否已指定的内容开头

1
2
3
NSString * str2 = @"www.yoferzhang.com";
BOOL isPerfix = [str2 hasPrefix:@"xww"];
NSLog(@"hasPerfix %@",isPerfix ? @"YES" : @"NO" );

3.3 判断字符串是否以指定的内容结尾

在开发中中常用在 判断文件格式 .txt .avi,.rmvb mkv doc mp3,mp4 pdf

1
2
3
NSString * str3 = @"www.yoferzhang.com.txtttt";
BOOL isSuffix = [str3 hasSuffix:@".txt"];
NSLog(@"hasSuffix %@",isSuffix ? @"YES" : @"NO" );

3.4 判断两个字符串是否相等

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
NSString * pstr1 = @"abc";
NSString * pstr2 = @"abc";
NSString * pstr3 = pstr1;

NSLog(@"pstr1 %p",pstr1);
NSLog(@"pstr2 %p",pstr2);

if (pstr1 == pstr2)
{
NSLog(@"== 判断 pstr1 与 pstr2相等");
}
if (pstr1 == pstr3)
{
NSLog(@"== 判断 pstr1 与 pstr3相等");
}

NSString * pstr5 = [NSString stringWithFormat:@"%@",@"abcd"];
NSLog(@"pstr5 %@",pstr5);
//使用 ==号 判断两个字符串 实际上是判断的字符串地址是否相同
//如果地址相同的话,两个字符串相等
NSLog(@"pstr5 %p",pstr5);

if (pstr5 == pstr3)
{
NSLog(@"== 判断 pstr5 与 pstr1相等");
}

在实际的开发中,切记不要使用== 号去判断两个字符串是否相等

判断两个字符串是否相等,必须使用NSString提供给我们的方法 isEqualToString

  1. 判断两个字符串指针地址是否相等,如果相等直接返回yes
  2. 取出字符串中的每一个字符进行比较
1
2
BOOL isEqual = [pstr5 isEqualToString:pstr3];
NSLog(@"isEqual %@",isEqual ? @"YES" : @"NO" );

3.6 compare 是isEqualToString的增强版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
NSString * strTmp1 = @"abc"; //a 97 b 98
NSString * strTmp2 = @"bbc";
NSComparisonResult result = [strTmp1 compare:strTmp2];


switch (result) {

case NSOrderedAscending:
NSLog(@"NSOrderedAscending");
break;
case NSOrderedSame:
NSLog(@"两个字符串相等");
break;
case NSOrderedDescending:
NSLog(@"NSOrderedDescending");
break;

default:
break;
}

模拟isEqualToString的内部实现

  1. 判断两个字符串指针地址是否相等,如果相等直接返回yes
  2. 取出字符串中的每一个字符进行比较
1
2
3
4
5
6
7
#import <Foundation/Foundation.h>

@interface NSString (NSStringExt)

- (BOOL)myIsEqual:(NSString *)str;

@end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#import "NSString+NSStringExt.h"

@implementation NSString (NSStringExt)

- (BOOL)myIsEqual:(NSString *)str
{
//1.判断两个字符串指针地址是否相等
//相等直接返回YES
if (self == str)
{
return YES;
}

//如果两个字符串的长度不相等
if (self.length != str.length)
{
return NO;
}

//逐个字符判断

for (int i = 0; i < str.length; i++)
{
unichar c1 = [self characterAtIndex:i];
unichar c2 = [str characterAtIndex:i];
if (c1 != c2)
{
return NO;
}
}

return YES;
}

@end

4 基本数据类型转换成字符串

基本数据类型(int float,double char)

4.1 int -> NSString

1
2
3
int a = 10;
NSString * str1 = [NSString stringWithFormat:@"%d",a];
NSLog(@"str1 %@",str1);

4.2 float -> NSString

1
2
3
float f = 2.4;
NSString * str3 = [NSString stringWithFormat:@"%.1f",f];
NSLog(@"str3 %@",str3);

4.3 double -> NSstring

1
2
3
double d = 65.9898;
NSString * str4 = [NSString stringWithFormat:@"%.4f",d];
NSLog(@"str4 %@",str4);

4.4 char -> NSString

1
2
3
char c = 'c';
NSString * str5 = [NSString stringWithFormat:@"%c",c];
NSLog(@"str5 %@",str5);

4.5 NSString -> int

1
2
3
NSString * str6 = @"1";
int i1 = [str6 intValue];
NSLog(@"i1 %d",i1);

4.6 NSString -> float

1
2
3
NSString * str7 = @"9.8";
float f1 = [str7 floatValue];
NSLog(@"f1 %.1f",f1);

4.7 NSString -> double

1
2
3
NSString * str8 = @"8.88";
double d1 = [str8 doubleValue];
NSLog(@"d1 %.2f",d1);

注意:当你要把字符串转换成某种基本数据类型的时候,一定要确定你要转化你的数据是正确

1
2
3
NSString * str9 = @"i386";
int i2 = [str9 intValue];
NSLog(@"is %d",i2);

4.8 将字符串中的字母转换成大写

1
2
3
NSString * str10 = @"china";
NSString * tmpStr1 = [str10 uppercaseString];
NSLog(@"tmpStr1 %@ str10 %@",tmpStr1,str10);

4.9 将字符中的字母转换成小写

1
2
3
NSString * str11 = @"CHINA";
NSString * tmpStr2 = [str11 lowercaseString];
NSLog(@"tmpStr2 %@",tmpStr2);

4.10 将首字母大写

1
2
3
NSString * str12 = @"china";
NSString * tmpStr3 = [str12 capitalizedString];
NSLog(@"tmpStr3 %@",tmpStr3);

5 字符串重组

5.1 多个数据拼接成一个字符串

1
2
3
4
5
6
7
8
int year = 1988;
int month = 4;
int day = 15;
NSString * date = [NSString stringWithFormat:@"%d年%d月%d日",year,month,day];
NSLog(@"date %@",date);
NSString * address = @"南山区,万利达";
NSString * dateAndAddrss = [NSString stringWithFormat:@"%@地址:%@",date,address];
NSLog(@"dateAndAddress %@",dateAndAddrss);

5.2 字符串的末尾追加新的字符

1
2
3
NSString * str1 = @"www.";
NSString * str2 = [str1 stringByAppendingString:@"yoferzhang.com"];
NSLog(@"str2 %@ str1 %@",str2,str1);

5.3 在制定的范围追加字符串

1
2
3
4
5
NSString * str3 = @"www.com";
NSRange range = {4,0};
// location代表的时从哪个索引开始插入,length 代表的意思可以覆盖几个字符
NSString * str4 = [str3 stringByReplacingCharactersInRange:range withString:@"yoferzhang."];
NSLog(@"str4 %@",str4);

5.4 使用新的字符,替换原有的字符

1
2
3
NSString * str5 = @"www.yoferzhang.com";
NSString * str6 = [str5 stringByReplacingOccurrencesOfString:@"w" withString:@"a"];
NSLog(@"str6 %@",str6);

5.5 在字符串中删除特定的某些字符

1
2
3
NSString * str7 = @"www---.yoferzhang.--com";
NSString * str8 = [str7 stringByReplacingOccurrencesOfString:@"-" withString:@""];
NSLog(@"str8 %@",str8);

5.6 去掉字符串中的空格

1
2
3
NSString * str9 = @"www  .yoferzhang  .com";
NSString * str10 = [str9 stringByReplacingOccurrencesOfString:@" " withString:@""];
NSLog(@"str10 %@",str10);

6 字符串写入文件

6.1 将字符串写入到文件

  1. 参数1 要给入文件目录(并且要包括文件名称)
  2. atomically : YES
  3. NSUTF8StringEncoding 国际通用的编码格式
  4. NSError 是用来记录错误信息的
1
2
3
4
5
6
7
8
9
10
11
12
13
NSString * content = @"数学之法,世界之道";
NSString * path = @"/Users/yoferzhang/Desktop/mytest.txt";
NSError * error;
BOOL isWriteSuccess = [content writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:&error];

if(isWriteSuccess)
{
NSLog(@"文件创建成功");
}
else
{
NSLog(@"error %@",error);
}

7 从文件中读取字符串内容

要给出文件路径

你写入文件的时候,使用的是什么编码格式,读取的时候就要用什么编码格式

1
2
3
4
5
6
7
8
9
10
11
12
NSString * path = @"/Users/yoferzhang/Desktop/mytest.txt";
NSError * error;
NSString * str = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];

if (error != nil)
{
NSLog(@"error message %@",error);
}
else
{
NSLog(@"str content %@",str);
}

8 可变字符串

8.1 创建可变字符串

NSMutableString 继承自 NSString

NSMutableString 拥有 NSString 所有的属性以及方法

1
NSMutableString * muStr = [[NSMutableString alloc] init];
1
NSMutableString * muStr = [[NSMutableString alloc] initWithCapacity:0];

8.2 初始化字符串内容

1
[muStr setString:@"www"];

8.3 动态的给字符串末尾追加新值

1
[muStr appendString:@".com"];

8.4 在指定的索引位置,插入字符串

1
[muStr insertString:@".yoferzhang" atIndex:3];

8.5 删除指定范围的字符串

你要删除的长度,一定不能够超出字符串的的长度,导致异常Range or index out of bounds

1
2
NSRange range = {3,7};
[muStr deleteCharactersInRange:range];
1
[muStr replaceCharactersInRange:range withString:@"数学之法"];

9 基本数据类型的包装类

9.1 使用 NSNumber 包装 int 数据类型

1
2
3
int a = 10;
NSNumber * number1 = [NSNumber numberWithInt:a];
NSLog(@"%@",number1);

9.2 直接转换成字符串

1
2
NSString * strInt = [number1 stringValue];
NSLog(@"strInt %@",strInt);

9.3 float 包装成 NSNumber

1
2
NSNumber * number2 = [NSNumber numberWithFloat:98.98];
NSLog(@"number2 %@",[number2 stringValue]);

9.4 包装类转换成基本数据类型

1
2
int b  = [number1 intValue];
NSLog(@"%d",b);

10 练习: 计算子串在真个字符串中出现的次数

@”abcd123abcdrgabc”

@”abc”

1
2
3
4
5
6
7
#import <Foundation/Foundation.h>

@interface NSString (NSStringExt)

- (int)calculateSubStringCount:(NSString *)str;

@end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#import "NSString+NSStringExt.h"

@implementation NSString (NSStringExt)

- (int)calculateSubStringCount:(NSString *)str
{
////@"abcd123abcdrgabc"
//@"abc"
int count = 0;

NSRange range = [self rangeOfString:str];
if (range.location == NSNotFound)
{
return count;
}

//声明一个临时字符串,记录截取之后的字符串
NSString * subStr = self;

while (range.location != NSNotFound) {

//只要进入循环就要count++
count++;
//每次记录之后,把找到的字串截取掉
//range.location + range.length 得出的结果就是我们要截取的字符串起始索引的位置
subStr = [subStr substringFromIndex:range.location + range.length];

NSLog(@"subStr %@",subStr);

//每一次截取之后,要判断一些,截取完成剩余部分字符串,是否还有子串存在
//如果存在,我们的while循环会继续运行,如果不存在while循环结束
range = [subStr rangeOfString:str];

NSLog(@"rang %@",NSStringFromRange(range));
NSLog(@"location=%lu",range.location);

}
return count;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
int main(int argc, const char * argv[])
{

@autoreleasepool {

NSString * str1 = @"abcd789ercsswwwbc45abc5";
NSString * str2 = @"abc";
int count = [str1 calculateSubStringCount:str2];
NSLog(@"count %d",count);

}
return 0;
}

新博客文章地址:
CSDN文章地址: