输出"烫烫烫烫"是因为vc会自动把未用函数的局部变量空间按字节全部初始化为CC。
而定义的字符数组空间不够,所以就占用了那部分不属于自己的空间,因为cout输出char*是要遇到空字符才停止的,所以便把那些垃圾都打出来了。
即是说在最后没有字符串结束标志'\0'。
扩展资料:
字符串的函数应用
1、连接运算 concat(s1,s2,s3…sn) 相当于s1+s2+s3+…+sn.
2、求子串。 Copy(s,I,I) 从字符串s中截取第I个字符开始后的长度为l的子串。
3、删除子串。过程 Delete(s,I,l) 从字符串s中删除第I个字符开始后的长度为l的子串。
例:s:=’abcde’delete(s,2,3)结果s:=’ae’
参考资料来源:百度百科-字符串
首先你要知道为什么会输出烫烫烫
看下面的例子
可以看出来,output数组前10项都被设置为'a',也都正常输出了,但是后面的部分输出变成了烫烫烫
原因是字符串在输出时,会从头开始输出,直到遇到'\0'停止
而output数组在我们使用之前没有初始化过,所以除了前10项我们手动设置为'a',剩下的数据还是混乱的值,所以就会输出烫烫烫了
要解决这个问题,手动在字符串结尾处补一个'\0'即可,见以下代码:
#include <stdio.h>#include <math.h>
#include <stdio.h>
int main()
{
char output[100]
for (int i = 0i < 10i++)
{
output[i] = 'a'
}
output[10]='\0'
//如果把上一句删掉就会出现输出烫的错误
printf("%s\n", output)
return 0
}
溢出了溢出了。输出"烫烫烫烫"是因为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(getline(in, line)) // 一次读取一行
str += line
in.close()
cout<<str
system("pause")
}
补充:产生那样的效果的原因,我上面已经解释过了,cout在输出char*类型,在遇到空字符'\0'之前,是会一直输出字符串的内容的。
你之所以数组定义得够大也会出现输出垃圾的原因,还是因为你每次只读一个字符,而且你while循环的逻辑也不大对:
while(in)
{
in.get(CH)// 如果读的是最后一个字符
if(in)str[j++]=CH// in现在是eof了,最后一个读不进去
}
所以应该改为如下所示,并且加上'\0':
while(in)
{
in.get(CH)
str[j++]=CH
}
str[j] = '\0'
再不懂的话,模拟你读取文件的动作:
char a[6]
a[0] = '1'
a[1] = '2'
cout <<a// a[2~5]是垃圾,注意
和
char a[6]
a[0] = '1'
a[1] = '2'
a[2] = '\0'
cout <<a
哪个a可以正确地被输出呢?
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)