C语言 字符串的输出,为什么输出那么多‘烫’呢?

C语言 字符串的输出,为什么输出那么多‘烫’呢?,第1张

输出"烫烫烫烫"是因为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可以正确地被输出呢?


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7921616.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-11
下一篇 2023-04-11

发表评论

登录后才能评论

评论列表(0条)

保存