为了账号安全,请及时绑定邮箱和手机立即绑定

为什么调用的strcpy不能赋值,哪位大虾知道原因啊,感激不尽!

为什么调用的strcpy不能赋值,哪位大虾知道原因啊,感激不尽!

C++
红颜莎娜 2023-01-03 21:17:29

这是我的.h文件
#include<string.h>
#include<iostream.h>
#define N 12;
class Candidate{
int votenum;
char name[20];
public:
Candidate(char nam[]);
int add(); //添加一票
int getvotenum();
char * getname();
void setname(char nam[]);
};

class Vote{
Candidate *Can_array[12];
int size; //候选人数
double percent; //百分比  
int sump; //投票人数
public:
Vote(char * name[],int n,double std);//初始化,给定候选人和获选标准
void vote1(char *name[],int n);//投票给n个人
int GetResult(char *name[],int snum[]);//返回获选标准,他们的姓名和票数
};

Candidate::Candidate(char nam[]){
strcpy(name,nam);

}

int Candidate::getvotenum(){
return votenum;


char * Candidate::getname(){
return name;
}

void Candidate::setname(char nam[]){
strcpy(name,nam);
}

int Candidate::add(){
return votenum++;
}

Vote::Vote(char * name[],int n,double std){
percent=std;
size=0;
if(n>12){
cout<<"候选人已满,不可以再添加!"<<endl;
}
else{
for(int i=0;i<n;i++){
Can_array[size]->setname(name[i]);
size++;


}

void Vote::vote1(char *name[],int n){
int i,j;
sump=n;
for(i=0;i<n;i++)
for(j=0;j<size;j++){
if(strcmp(Can_array[j]->getname(),name[i])==0)
Can_array[j]->add();
}
}

int Vote::GetResult(char *name[],int snum[]){
int num,j=0;
int n=0;
for(int i=0;i<size;i++){
num=Can_array[i]->getvotenum();
if((num/sump)>=percent){
strcpy(name[j],Can_array[i]->getname());
snum[j]=Can_array[i]->getvotenum();
j++;
n++;
}
}
return n;
}

主函数:
#include"vote.h"
#include<iostream.h>

void main()
{
char *name0[]={"a","b", "c","d","e"};
char *name1[]={"a","a","a","b","c"};
char *name3[5];
int sum[5];
Vote a(name0,5,0.5);
a.vote1(name1,5);
int n=a.GetResult(name3,sum);
cout<<"当选的人有"<<n<<"个"<<endl;
for(int i=0;i<n;i++){
cout<<name3[i]<<" "<<sum[i]<<endl;
}
}
编译没问题,但是在单步调试时 添加候选人姓名Can_array[size]->setname(name[i]);

查看完整描述

1 回答

?
繁华开满天机

TA贡献1552条经验 获得超4个赞

类Vote中的成员变量Can_array声明为:
Candidate *Can_array[12];
也就是说,Can_array中的每一个元素都是指针,这样,在没有为指针分配空间前,是没法使用的,所以在Vote的构造函数中使用Can_array[size]->setname(name[i]);必定让程序Go Down。
解决方法:
一:把声明中的指针标记"*"去掉,当然,同时之后的操作符也应该有"->"改为"."。
二:把声明后面的"[12]"去掉,在构造函数中,预先为其分配空间,使用
Can_array = new Candidate[12];
或者更适合的:
Can_array = new Candidate[n];

查看完整回答
反对 回复 2023-01-06

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信