下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】怎么在iOS中翻转字符串
怎么在iOS中翻转字符串?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。字符串翻转作为算法题已经是一个不能再基础的问题了,无非就是逆序遍历、双指针遍历、递归,代码也能分分钟写出来:void
strrev(char
*str)
{
size_t
start
=
0;
size_t
end
=
start
+
strlen(str)
-
1;
while
(start
<
end)
{
char
ch
=
str[start];
str[start++]
=
str[end];
str[end--]
=
ch;
}
}OK,上面的代码放到LeetCode上绝对是能AC的,但是实际情况中能AC吗?答案肯定是不能的!一个靠谱的字符串翻转算法题放到LeetCode上至少是Medium的难度。首先我们知道字符串有编码规则,比如我们常用的UTF-8,Windows早期采用的UTF-16(函数名有W后缀的API采用这种编码)等等...对于英文字母等ASCII字符的情况,UTF-8和ASCII编码都是一个字节,所以上述的方法没有太大问题。然而对于有中文的情况,一个中文字符在UTF-8中会占3个字节,如果单纯的按字节翻转就会出现乱码。那怎么解决呢?最简单的方法就是使用mbstowcs函数将char*类型的字符串转换为wchar_t类型的宽字符串,wchar_t这个类型在Linux、UNIX系统上占4个字节,在Windows上占2个字节。4个字节意味着字符将用UTF-32来编码,不管是汉字还是Emoji都能存放下来。但对于2个字节,也就是UTF-16,汉字是能表示,但是Emoji这类位于辅助平面码位的字符需要两个码元来表示,本文的方法就暂不适用了。首先我们来看一下改进版的字符串翻转:static
void
strrev2(char
*str)
{
setlocale(LC_CTYPE,
"UTF-8");
size_t
len
=
mbstowcs(NULL,
str,
0);
wchar_t
*wcs
=
(wchar_t
*)
calloc(len
+
1,
sizeof(wchar_t));
mbstowcs(wcs,
str,
len
+
1);
size_t
start
=
0;
size_t
end
=
start
+
len
-
1;
while
(start
<
end)
{
wchar_t
wc
=
wcs[start];
wcs[start++]
=
wcs[end];
wcs[end--]
=
wc;
}
wcstombs(str,
wcs,
wcstombs(NULL,
wcs,
0));
free(wcs);
}使用mbstowcs这类转换函数首先需要设置字符串的系统编码,不然函数无法确定你传入的char*是个什么东西,本文中不管是源码还是系统环境的stdI/O都采用UTF-8编码。接下来我们调用一次mbstowcs不传入目标地址和字符长度,这可以让函数直接计算所需的wchar_t个数并返回回来以便我们申请内存。然后就是基于wchar_t的一个常规字符串翻转了,最后别忘了转换回去,释放内存即可。Bonus:Cocoa开发中的字符串翻转作为iOS开发者,当然还要考虑OC中的解决方法了。方案1:通过API遍历子串,然后前向插入到新的NSMutableString中。-
(NSString
*)my_stringByReversing
{
NSMutableString
*reversed
=
[NSMutableString
stringWithCapacity:self.length];
NSRange
range
=
NSMakeRange(0,
self.length);
[self
enumerateSubstringsInRange:range
options:NSStringEnumerationByComposedCharacterSequences
usingBlock:^(NSString
*
_Nullable
substring,
NSRange
substringRange,
NSRange
enclosingRange,
BOOL
*
_Nonnull
stop)
{
[reversed
insertString:substring
atIndex:0];
}];
return
[reversed
copy];
}这种方法是效果最好的,它会将ComposedEmoji(如????)也提取出来,因为这类Emoji是由多个Unicode字符组合而成的,所以即便是4个字节的wchar_t也容纳不下。但这种方法的弊端就是开销太大,稍后我们做一个比较。方案2:通过API获取到CString,然后用文章开头所述的方法处理,再重新用处理后的CString构造NSString。-
(NSString
*)my_stringByReversing2
{
NSUInteger
length
=
[self
lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
char
*buf
=
calloc(length
+
1,
1);
[self
getCString:buf
maxLength:length
+
1
encoding:NSUTF8StringEncoding];
strrev2(buf);
NSString
*reversed
=
[NSString
stringWithCString:buf
encoding:NSUTF8StringEncoding];
free(buf);
return
reversed;
}这种方法的好处就是高效,经测试,它与遍历的方法相比有100多倍的性能提升,但是问题就是无法处理复杂的Emoji。两种方法,在使用中需要好好衡量一下。方案3:Swift。Swift的String的基本单位是Character,它是UnicodeScalar的集合,表示了一个可渲染的字符,包括ComposedEmoji。并且,String是实现了BidirectionalCollection,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 5G移动通信的关键技术及应用发展
- 5052铝合金阳极氧化黄蓝色差相关性研究
- 480°混凝土旋转楼梯施工技术
- 3GPP 5G NR物理层关键技术综述
- 3D创客教育与高中信息技术教学融合探索
- 2种模型对堆石坝变形分析的对比研究
- 20t以下带吊车门式刚架钢结构厂房设计实例分析
- 2020年中国俄罗斯东欧中亚学会俄语教学研究会会员单位计划开展的主要活动
- 2018年中国水电发展趋势探讨
- 2005-2015年中国义务教育均衡性的实证检验-基于生均经费视角
- Q∕SY 06020-2016 油气田地面工程环境保护设计规范
- 行政事业内控评价报告
- 2021年全国中考数学几何压轴题
- 国内煤化工企业典型事故案例分析
- 2022年浙江省宁波市中考语文试题(含答案)
- 铝模与木模的对比
- 交通枢纽信息化平台建设方案详细
- 三只小猪盖房子PPT课件(PPT 34页)
- 卡通医生护士工作报告模板ppt
- 线性方程组与矩阵特征值求解的数值方法
评论
0/150
提交评论