delphi 字符串处理中的怪异现象与处理方式
1, 怪异现象:字符串相加操作不正常!
以上代码,明显输出字符串应含有后缀“.jpg”,但实际输出却不含后缀(如下),字符串加法操作似乎不起作用了!
采用showMessage进行输出,看看结果如何?
结果仍是不显示字符串后缀,但可以看到字符串偏左显示,似乎后面还有很多不可见字符。
2,怪异原因:字符串中含有\0,即字符串终止符
以上现象已经看出,字符串加法失效的原因可能是含有某些不可见字符,那到底是什么字符呢?
回到这些字符串产生的源头,即下面由字节数组转换成字符串函数:
显然,此函数未考虑len长度以内可能含有的\0字符,如果buffer中len长度以内含有\0字符,那么这些\0字符也会被复制进result字符串中,造成后续字符串加法“失效”。
3,解决方案:修改函数
将函数修改如下,判断逐字节判断buffer,遇到\0就返回,这样转换的字符串就不含\0了。问题解决。
//字节转换为字符串 $D4 $C1--> '粤' function BytesToString(buffer: Array of byte; offset:integer; len: integer): string; var str: string; i : Integer; begin SetLength(str, len); for i:=0 to len-1 do begin if buffer[offset-1+i]=0 then break; //遇到ASCII 0不再复制! Move(buffer[offset-1+i], str[1+i], 1);//注意,这里是从str[1]开始复制的 end; //Move(buffer[offset-1], str[1], len);//注意,这里是从str[1]开始复制的 //ShowMessage (str); SetLength(str, i); result := str; end;
以上这篇delphi 字符串处理中的怪异现象与处理方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。
相关推荐
-
解决delphi TAdoQuery组件的close方法导致”列名无效“错误的问题
1,故障现象 一次程序运行,出现如下错误: 对应代码如下: 2,故障分析 Query_alert_2的语句在查询分析器中单独执行是正常的.排除语句出错. 如果注解掉Query_alert_1,则错误变为Query_alert_3执行出错: 2019-07-11 09:32:26 Query_alert_1执行完毕 2019-07-11 09:32:27 Query_alert_2执行完毕 2019-07-11 09:32:42 Do_Update_Statis出错:列名 'bat_pos1' 无
-
delphi 字符串处理中的怪异现象与处理方式
1, 怪异现象:字符串相加操作不正常! 以上代码,明显输出字符串应含有后缀".jpg",但实际输出却不含后缀(如下),字符串加法操作似乎不起作用了! 采用showMessage进行输出,看看结果如何? 结果仍是不显示字符串后缀,但可以看到字符串偏左显示,似乎后面还有很多不可见字符. 2,怪异原因:字符串中含有\0,即字符串终止符 以上现象已经看出,字符串加法失效的原因可能是含有某些不可见字符,那到底是什么字符呢? 回到这些字符串产生的源头,即下面由字节数组转换成字符串函数: 显然,此函
-
PHP函数rtrim()使用中的怪异现象分析
本文实例讲述了PHP函数rtrim()使用中的怪异现象.分享给大家供大家参考,具体如下: 今天用rtrim()函数时遇到了一个奇怪的问题: echo rtrim('<p></div>', '</div>'); // 输出为 <p echo ltrim('www.jb51.net','www.'); // 输出为 jb51.net 以上的输出结果有点出人意料,本来我想第一行应该输出<p>,第二行会输出jb51.net. 这个问题纠结了我好久,一直没有找到
-
delphi字符串分隔函数用法实例
本文实例讲述了delphi字符串分隔函数用法.分享给大家供大家参考.具体实现方法如下: 该实例可实现根据字符串Separator的表示将字符串s分隔为若干个字符串,存入rs字符串列表中,具体代码如下: 复制代码 代码如下: procedure SeparateTerms2(s:string;Separator:string;var rs:TStringList); var AStr: string; idx: Integer; ASubStr: string; begin ASt
-
Delphi实现Listbox中的item根据内容显示不同颜色的方法
本文简述了Delphi实现Listbox中的item根据内容显示不同颜色的方法,实现步骤如下: ListBox1 的 Style 属性改为 lbOwnerDrawVariable 在ListBox的OnDrawItem事件裡,根据item的值,改变Canvas属性 示例代码如下: procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState);
-
JS 清除字符串数组中,重复元素的实现方法
JS 清除字符串数组中,重复元素的实现方法 <script language="JavaScript"> <!-- var arrData=new Array(); for(var i=0; i<1000; i++) { arrData[arrData.length] = String.fromCharCode(Math.floor(Math.random()*26)+97); } //document.write(arrData+"<br/&g
-
Lua字符串库中的几个重点函数介绍
在<Lua中的一些库>中也说到了,要对string库的模式匹配进行单独的讲解.对于字符串的处理,对于任何语言的学习来说,都是一个难点,而且也是一个必会的知识点.给你一个字符串,让你按照某种需求进行处理,你不会,那是多么尴尬的一件事情.所以,看完<Lua中的一些库>和这篇文章之后,我争取做到让你在处理字符串时,不再感到捉襟见肘,不再尴尬. 说到Lua中的模式匹配,基本上就是围绕着以下几个函数展开的: 1.find: 2.match: 3.gsub: 4.gmatch. 我的总结也就是
-
JQurey入门——事件机制之事件中的冒泡现象示例解释
1.当用户浏览页面时,浏览器会对页面代码进行解释或编译--这个过程实质上是通过事件来驱动的,即页面在加载时,执行一个Load事件,在这个事件中实现浏览器编译页面代码的过程.事件被触发后被分为两个阶段,一个是捕获(Capture),另一个是冒泡(Bubbing),但大多浏览器并不是都支持捕获阶段,因此事件被触发后,往往执行冒泡过程. 2.示例代码: 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN
-
C#.NET字符串比较中忽略符号的方法
比如有这样两个字符串: 复制代码 代码如下: var a = "a-b=c12"; var b = "a.b___c12"; 好吧显然无论你使用哪种常规方法,他们的比较结果肯定不是0,因为他们长度不等,即使长度相等由于字符之间的符号不等他们也不可能相等. 怎样在字符串比较中忽略符号?事实上CompareOptions.IgnoreSymbols枚举选项可以达到这个要求.使用CultureInfo中的CompareInfo,然后用CompareI
-
c#实现从字符串数组中把数字的元素找出来
下面这个字符串数组: string[] str = { "3","y","34","QQ","41","adsf4","7","52"}; 实现这个要求的方法也许会很多.下面Insus.NET使用一个通用的方法来实现: 面向对象,创建一个类别Class Digit: class Digit { private int _D; public int
-
C++ 读文件 将文件内容读入到字符串string中的方法
如下所示: #include <string> #include <fstream> #include <sstream> #include <iostream> #include <stdlib.h> using namespace std; //从文件读入到string里 string readFileIntoString(char * filename) { ifstream ifile(filename); //将文件读入到ostring
随机推荐
- PHP实现发送邮件的方法(基于简单邮件发送类)
- Angular 4 指令快速入门教程
- 详解springboot中junit回滚
- Java进阶学习:网络服务器编程
- 浅谈Javascript嵌套函数及闭包
- 学习JavaScript设计模式之责任链模式
- java ant包中的org.apache.tools.zip实现压缩和解压缩实例详解
- Sql学习第一天——SQL 练习题(建表/sql语句)
- 深入浅析JavaScript中的Function类型
- js自动下载文件到本地的实现代码
- Spring MVC 基于URL的映射规则(注解版)
- linux中了minerd之后的完全清理过程(详解)
- Linux服务器中对于Memcache的安装配置方法
- Android 设置颜色的方法总结
- 交换机的一点配置笔记cisco
- Windows下的Jupyter Notebook 安装与自定义启动(图文详解)
- vue的diff算法知识点总结
- Python函数的参数常见分类与用法实例详解
- 使用mmap实现多进程对大文件拷贝
- PHP 计算两个特别大的整数实例代码