炀人 2021-05-07 20:31 采纳率: 0%
浏览 56

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个之后,再输出就会出现乱码

  • 写回答

5条回答 默认 最新

  • CSDN专家-Time 2021-05-07 20:38
    关注

    因为数组越界

    评论

报告相同问题?

悬赏问题

  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3