c/c++ 处理字符串时要注意的问题
来源:互联网 发布:淘宝空间协议在哪里 编辑:程序博客网 时间:2024/04/30 08:31
c/c++ 处理字符串时要注意的问题。
最近在写一个文件操作的时候,出现了一点儿问题。虽不是大问题,但是不注意的话会产生错误。
为了验证读取的正确性,我输出读取的字符串。发现读取的和原文件不同。为了查找问题,我输出了读取的个数。
输出的个数和,与原文见大小相同?我还怀疑是不是编码的问题,不过在查找资料之后排除了。因为在源文件中能显示,复制之后也应该没问题。
在readFromStream()中,将 // (1)注释删除,就正确了。所以正确的方法如下:
字符串后面一定要加 '\0'。
即使用数组保存字符串时,有时在输出时并不会判断一读到数组末尾,而是以结束符 '\0' 作为唯一标志。
(分析,猜测)
输出时,虽然传入数组名,可是把它当做指针,所以无法判断数组大小。所以即使读到数组末尾,还会继续输出额外内容。
最近在写一个文件操作的时候,出现了一点儿问题。虽不是大问题,但是不注意的话会产生错误。
写了一个块读取的方法。
从inf 流中,最多读取num个字符,保存在buf中,并返回读取字符数。
int readFromStream(ifstream &inf, char *buf, int num){ //cout<<"her"<<endl; int cnt = 0; // (1) while(! inf.fail() && cnt < num - 1)while(! inf.fail() && cnt < num) { inf.get(buf[cnt]); if(!inf.eof()) { cnt++; } else { buf[cnt] = '\0';} } // (1) buf[num - 1] = '\0'; return cnt;}
为了验证读取的正确性,我输出读取的字符串。发现读取的和原文件不同。为了查找问题,我输出了读取的个数。
int readFile(ifstream &inf){char buf[100]; int readNum ; while(0 != (readNum = readFromStream(f_in, buf, 100))) {cout<<readNum<<endl; // (2) cout<<readNum<<" : "<<strlen(buf)<<endl; //f_out<<buf; }}
输出的个数和,与原文见大小相同?我还怀疑是不是编码的问题,不过在查找资料之后排除了。因为在源文件中能显示,复制之后也应该没问题。
后来我又检查了一下buf中字符串的大小,即将 //(2)注释删除。
理论上应该是 100, 100, ..., (file_size % 100),但是发现除了最后一个其余的都大于100。
这下就很明了了。原来是字符串结束符不存在,导致读取的额外的数据造成了。在readFromStream()中,将 // (1)注释删除,就正确了。所以正确的方法如下:
///从inf 流中,最多读取 (num-1) 个字符,保存在buf中,并返回读取字符数。int readFromStream(ifstream &inf, char *buf, int num){ //cout<<"her"<<endl; int cnt = 0; while(! inf.fail() && cnt < num - 1) { inf.get(buf[cnt]); if(!inf.eof()) { cnt++; } else { buf[cnt] = '\0';} } buf[num - 1] = '\0'; return cnt;}
字符串后面一定要加 '\0'。
即使用数组保存字符串时,有时在输出时并不会判断一读到数组末尾,而是以结束符 '\0' 作为唯一标志。
(分析,猜测)
输出时,虽然传入数组名,可是把它当做指针,所以无法判断数组大小。所以即使读到数组末尾,还会继续输出额外内容。
因为字符串是保存在字符数组中,而且以 '\0'作为结束标志。如果字符数组中字符占满了全部空间,就可能在输出时没有监测到结束符 '\0' 而导致读取额外数据,从而产生不必要的错误。
经验谈:
切记,字符数组保存字符串时,一定要留一个空间保存结束符 '\0'。
0 0
- c/c++ 处理字符串时要注意的问题
- C/C++在比较字符串时要注意的
- 字符串的处理[C#]
- c字符串的处理
- [C] 一个要注意的输入输出问题
- C语言要注意的一些问题
- Linux C 格式化输出时要注意的问题
- Linux C 格式化输出时要注意的问题
- C#DataRow注意的问题
- PHP处理字符串时需要注意的问题
- 关于C语言字符串Dddi DdD的一些问题处理
- Objective-C 字符串的处理
- C语言字符串的处理
- C语言的字符串处理
- C/C++中的字符串处理问题
- C程序注意问题
- C语言注意问题
- c#string注意问题
- 语言函数可变长参数
- 养成追求优秀的习惯
- 枚举类
- 开源 java CMS - FreeCMS2.3 评论管理
- .NET下的一些AOP框架介绍
- c/c++ 处理字符串时要注意的问题
- Android资源代码 源码 整理 Github开源项目下载地址
- CCF简单模拟题一水
- Log4j使用指南
- Android把相同图片放到不同的文件夹显示不同的问题
- win10 升级10041:Windows can't be installed because this PC has an unsupported disk layout for UEFI
- request&response笔记
- In-App Purchase 实战总结
- AngularJs之与后端服务器通信