C++中串输出出现乱码

#include<iostream>
using namespace std;
const int size=10;

struct str
{
	int length;
	int time;
	int maxsize;
	char *a;
}; 

void initial(str &n); 
void input(str &n);
void extend(str &n);
void copy(str &n,str m);
void connect(str &n,str m);
void output(str n);
void sub(str &n,str m);
void length(str &n);
void dele(str &n);

int main()
{
	str a,b;
	initial(a);
	initial(b);      //初始化 a,b 
	input(a);       //向 a 中输入字符串 
	copy(b,a);      //将 a 中字符串复制到 b 中 
	length(b);
	connect(b,a);    // 将 a 连接到 b的尾部 
	connect(b,a);
	output(a);
	output(b);
	length(a);
	length(b);
	dele(a);
	dele(b);
}

void initial(str &n)
{
	n.time=1;
	n.maxsize=size;
	n.a=new char[size];
}

void input(str &n)
{
	cout<<"输入字符串"<<endl;
	char a;
	int i=1;
	for(;;i++)
	{
		cin>>a;
		if(i>=n.maxsize-1)    //大于当前空间则执行扩容 
		{
			extend(n);
		}
		
		if(a=='#')
		{
			cout<<"输入结束"<<endl;
			break;
		}
		else
		{
			n.a[i]=a;
		}
	}
	n.length=i-1;
}

void extend(str &n)       //作用相当于 realloc 
{
	n.time++;
	char *temp=new char[n.time*size];
	n.maxsize=(n.time)*size;
	for(int i=0;i<=n.length;i++)
	{
		temp[i]=n.a[i];
	}
	n.a=temp;
}

void copy(str &n,str m)    //把 m 串复制给 n,此处默认 n为空 
{
	if(m.length>n.maxsize-1)
	{
		int i=1;
		int time=(m.length-n.maxsize)/10+1;
		for(;i<=time;i++)
		{
			extend(n);
		} 
	}
	int i=1;
	for(;i<=m.length;i++)
	{
		n.a[i]=m.a[i];
	}
	n.length=m.length;
}

void connect(str &n,str m)    //把 m 接到 n的尾部 
{
	if((n.length+m.length)>n.maxsize-1)      //本来是 -2 ,但是新连接的串没有必要 用空的 [0]位置占地,所以改为-1 
	{
		int t=((n.length+m.length)-n.maxsize+1)/10+1;
		for(int i=1;i<=t;i++)
		{
			extend(n);
		}
	}
	int i=n.length+1;
	int o=1;
	for(;i<=m.length+n.length;i++)          //    for(;i<=m.length;i++,o++)
	{
		n.a[i]=m.a[o];
		o++;
	}
	n.length=m.length+n.length;     //  n.length=m.length+1;
}

void output(str n)
{
	int i=1;
	for(;i<=n.length;i++)
	{
		cout<<n.a[i];
	}
	cout<<endl;
}

void sub(str &n,str m)   //将 m中某子串取出赋值给 n
{
	cout<<"请输入从第几个字符开始"<<endl;
	int a;
	cin>>a;
	
	if(n.maxsize-1<m.length-a)
	{
		int time=(n.maxsize-1-(m.length-a))/10+1;
		for(int i=1;i<=time;i++)
		{
			extend(n);
		}
	}

	int b=1;
	for(;a<=m.length;a++)
	{
		n.a[b]=m.a[a];
		b++;
	}
	n.length=m.length-a;
 }
 
void length(str &n)
{
	cout<<"字符串长为: "<<n.length<<endl; 
}

void dele(str &n)
{
	delete []n.a;
}

在字符数超过7个之后,再输出就会出现乱码

因为数组越界

给你找到了主要原因:

在input函数中,i必须是从0开始,否则后续的字符都无法存储到指针a中

int i = 0;

当然字符串,拼接中,可能你某个长度还是有问题,这得你自己去调试看看了!

对你有帮助的话,点个采纳吧!


希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10581430.html
希望对你有帮助:https://blog.csdn.net/it_xiangqiang/category_10768339.html

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!

速戳参与调研>>>https://t.csdnimg.cn/Kf0y