字符串输出乱码:烫烫烫烫.....

来源:百度知道 编辑:UC知道 时间:2024/05/27 19:59:54
#include<iostream>
#include<fstream>
using namespace std;
void main()
{
char CH,str[100];
//int i=0,j=0,k=0;
int j=0;
ifstream in("test1.txt");
if(!in)
{
cout<<"文件打开失败"<<endl;
}
while(in)
{
in.get(CH);
if(in)str[j++]=CH;
}
in.close();
cout<<str;

system("pause");
}

以上是我写的一个读取文件的小程序,直接的输入输出没有问题,可是当把读入的东西放到字符串里面再输出的时候就出现了一堆乱码,请问各位高手应当怎么办啊?这段程序的输出结果是:烫烫烫烫.......
这位师兄说的有一定的道理,不过即使不溢出也会产生这样的输出结果。比如我在文件“test1.txt”里面仅仅放了五个字符,而定义的字符串却是一百个字符,也会产生这样的后果。还有就是请告诉我,您以前遇到这样的问题的时候是怎么处理的啊?

溢出了溢出了。输出"烫烫烫烫"是因为vc会自动把未用函数的局部变量空间按字节全部初始化为CC。而你定义的字符数组空间不够,所以就占用了那部分不属于你的空间,因为cout输出char*是要遇到空字符才停止的,所以便把那些垃圾都打出来了。

这是我在vc2005发现的,vc2008就没有这个动作,其他编译器没试过(看你用void main想必你用的是vc6吧,那么估计vc6也会这样,但奉劝一句,学C/C++最好别用vc6,因为它不完善的地方会使你助长一些不易改变的坏习惯)。

比如:

int main()
{
char buf[12]; // 未初始化
cout << buf; // 很多“烫烫烫烫...”
}

解决方法很简单啊,数组弄大点,但这样不能从根本上解决问题,因为文本的大小你事先不知道,所以如果文本字节数大出数组大小很多的话,甚至会出错,比如:

char buf[2];
cin >> buf; // 尽量输入多一点试试?

所以最好用string类,有那么方便安全的东西为什么不用呢?而且不用一个字符一个字符地读,像你那样,一个字符调用一次函数,效率太低了,用string类的话,稍微改一下就好了:

#include<iostream>
#include<fstream>
#include <string>
using namespace std;

void main()
{
string line;
string str;
//int i=0,j=0,k=0;
int j=0;
ifstream in("test1.txt");
if(!in)
{
cout<<"文件打开失败"<<endl;
return; // 打开失败就直接结束了
}
while(