编译能过,但是输入数据就出错!

t0nsha 2007-06-16 09:41:11
编译能过,但是输入数据就出错!
代码:

#include <string.h>
#include <iostream.h>
const int n=10;
struct Person
{
char* name;
int count;
}Leader[n];
void Election(Person Leader[],int n)
{
char* name;
cout<<"请输入候选人名:";
cin>>name;
while(name!="#")
{
for(int i=0;i<n;i++)
if(strcmp(Leader[i].name,name)==0)Leader[i].count++;
cout<<"请输入:";
cin>>name;
}
for(int i=0;i<n;i++)
cout<<Leader[i].name<<"得票数为,"<<Leader[i].count<<endl;
}
void main()
{
Election(Leader,n);
}
...全文
360 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
t0nsha 2007-06-23
  • 打赏
  • 举报
回复
辛苦各位了,
分有点少,
不好意思~
呵呵~~
庄鱼 2007-06-22
  • 打赏
  • 举报
回复
对不起!当时随手写的没做调试,下面这个应该可以了:
#include <string.h>
#include <iostream.h>

const int n=3;
const int LEN=10;

struct Person{
char *name;
int count;
}Leader[n];

Person *Create(const char *name,int num)
{
Person *p = new Person;
int mn = strlen(name);
p->name = new char[mn+1];
strcpy(p->name,name);
p->name[mn]='\0';
p->count = num;
return p;
}

void Free(Person *p)
{
if(p){
delete []p->name;
// delete p;
}
}

Person *Copy(Person *o,Person *s)
{
if(o&&s){
int mn;
char *c = new char[mn=strlen(s->name)+1];
if(c==0)return o;
strcpy(c,s->name);
c[mn]='\0';
delete []o->name;
o->name = c;}
return o;
}

bool Init(Person *p,int n)
{
if(!p)return false;
int count=0;
char *name = new char[LEN+1];
do{
cout<<"请输入候选人名,输入#号结束:";
cin>>name;
name[LEN]=0;
if(strstr(name,"#"))break;
Person *t = Create(name,0);
Copy(&(p[count++]),t);
delete t;
}while(count<n);
delete []name;
return count>0;
}

void Election(Person Leader[],int mn)
{
char* name = new char[LEN];
cout<<"请为候选人名投票,以#号结束:";
cin>>name;
while(!strstr(name,"#")/*name!="#"*/){
for(int i=0;i<n;i++)
if(strcmp(Leader[i].name,name)==0)Leader[i].count++;
cout<<"请为候选人名投票,以#号结束:";
cin>>name;}
delete []name; //--------------
for(int i=0;i<mn;i++)
cout<<Leader[i].name<<"得票数为,"<<Leader[i].count<<endl;
}

int main()
{
if(Init(Leader,n))
Election(Leader,n);
for(int i=0;i<n;i++)
Free(&Leader[i]);
return 0;
}
t0nsha 2007-06-22
  • 打赏
  • 举报
回复

多谢“FreeFice(庄鱼) ”兄的不厌其烦,将源程序又修改了一下,
但是新的错误有出现了,以下代码能运行,不过在debug下会弹出
错误提示,而release下则没有这个问题(内存分配问题?),不知咋改?
再次多谢各位热心哥们热心帮助!

#include <string.h>
#include <iostream.h>

const int n=3;
const int LEN=10;

struct Person
{
char *name;
int count;
}Leader[n];

Person *Create(const char *name,int num)
{
Person *p = new Person;
int n = strlen(name);
p->name = new char[n+1];
strcpy(p->name,name);
p->name[n]='\0';
p->count = num;
return p;
}

void Free(Person *p)
{
if(p)
{
delete []p->name;
delete p;
p=0;
}
}

Person *Copy(Person *o,Person *s)
{
if(o&&s)
{
int n;
char *c = new char[n=strlen(s->name)+1];
if(c==0)return o;
strcpy(c,s->name);
c[n]='\0';
delete []o->name;
o->name = c;
}
return o;
}

bool Init(Person *p,int n)
{
if(!p)return false;
int count=0;
char *name = new char[LEN];
do{
cout<<"请输入候选人名,输入#号结束:";
cin>>name;
if(strstr(name,"#"))break;
Person *t = Create(name,0);
Copy(&p[count++],t);
delete t;
}while(count<n);
delete []name;
return count>0;
}
void Election(Person Leader[],int n)
{
char* name = new char[LEN];
cout<<"请为候选人名投票,以#号结束:";
cin>>name;
while(!strstr(name,"#")/*name!="#"*/)
{
for(int i=0;i<n;i++)
if(strcmp(Leader[i].name,name)==0)Leader[i].count++;
cout<<"请为候选人名投票,以#号结束:";
cin>>name;
}
delete []name; //--------------
for(int i=0;i<n;i++)
cout<<Leader[i].name<<"得票数为,"<<Leader[i].count<<endl;
}
int main()
{
if(Init(Leader,n))
Election(Leader,n);
for(int i=0;i<n;i++)
Free(&Leader[i]);
return 0;
}
庄鱼 2007-06-22
  • 打赏
  • 举报
回复
哦,你这样用:
bool Init(Person *p,int n)
{
if(!p)return false;
int count=0;
char *name = new char[LEN];
do{
cout<<"请输入候选人,在空行输入#号结束:";
cin>>name;
if(strstr(name,"#"))break;
Peason *t = Create(name,0);
Copy(&p[count++],t);
delete t;
}while(count<n);
delete []name;
return count>0;
}
void Election(Person Leader[],int n)
{
char* name = new char[LEN];//-------
cout<<"请输入候选人名:";
cin>>name;
while(name!="#")
{
for(int i=0;i<n;i++)
if(strcmp(Leader[i].name,name)==0)Leader[i].count++;
cout<<"请输入:";
cin>>name;
}
delete []name; //--------------
for(int i=0;i<n;i++)
cout<<Leader[i].name<<"得票数为,"<<Leader[i].count<<endl;
}
int main()
{
if(Init(Leader,n))
Election(Leader,n);
for(int i=0;i<n;++i)
Free(&Leader[i]);
return 0;
}
yamanakajp 2007-06-21
  • 打赏
  • 举报
回复
char *name是指针
内存没分配
t0nsha 2007-06-21
  • 打赏
  • 举报
回复
根据“iambic”兄的提示,得出与我所想功能想符的程序,不过还是有点瑕疵(具体请看代码):

// 工程名:Election
// 文件名:Election.cpp
// 功能:统计候选人的投票数
// 依赖文件:无

#include <iostream>
#include <string>
using namespace std;

const int n=3; //假设有3个候选人
struct Person
{
string name;
int count;
}Leader[n];

void Election(Person Leader[],int n)
{
string name;
cout<<"请输入候选人名为其投票:";
cin>>name;
while(name!="#")
{
for(int i=0;i<n;i++)
if(Leader[i].name==name)Leader[i].count++;
cout<<"继续投票以“#”结束输入:";
cin>>name;
}
for(int i=0;i<n;i++)
cout<<Leader[i].name<<"得票数为,"<<Leader[i].count<<endl;
}

void main()
{
for(int i=0;i<n;i++)
{
cout<<"请输入第i个候选人名字(共3个):"<<endl; //这个功能有欠缺
string name;
cin>>name;
Leader[i].name=name;
}
Election(Leader,n);
}


“FreeFice(庄鱼)”兄的解法还是不太会用,望指点!
t0nsha 2007-06-20
  • 打赏
  • 举报
回复
sorry,感觉自己真的太不负责任了,我说一下程序得来源和用途吧,
程序上的下两段是来自一本叫做《数据结果(c++版)学习辅导与实验指导》(清华大学出版社)的书:
//第一部分
const int n=10;//假设有10个人参加选举
struct Person
{
char* name;
int count;
}Leader[n];
//第二部分,算法描述
void Election(Person Leader[],int n)
{
cin>>name;
while(name!="#")
{
for(int i=0;i<n;i++)
if(strcmp(Leader[i].name,name)==0)Leader[i].count++;
cin>>name;
}
for(int i=0;i<n;i++)
cout<<Leader[i].name<<"得票数为,"<<Leader[i].count<<endl;
}
//代码结束
用途:统计n(10)个候选人的得票情况。
没有提供完整的程序,带main函数的代码是我添加的,但是不能运行……
c++有些基本的也不太懂(比如:using namespace std;),希望哪位大哥给改正后能够适当给出注释,谢谢!
庄鱼 2007-06-20
  • 打赏
  • 举报
回复
你要添加:
Person *Create(const char *name,int num)
{
Person *p = new Person;
int n = strlen(name);
p->name = new char[n+1];
strcpy(p->name,name);
p->name[n]='\0';
p->count = num;
return p;
}
void Free(Person *p)
{
if(p){
delete []p->name;
delete p;
p=0;}
}
Person *Copy(Person *o,Person *s)
{
if(o&&s){
int n;
char *c = new char[n=strlen(s->name)+1];
if(c==0)return o;
strcpy(c,s->name);
c[n]='\0';
delete []o->name;
o->name = c;}
return o;
}
mljgxb 2007-06-20
  • 打赏
  • 举报
回复
using namespace std;
使用名字空间。。。提供了声明的作用域。。。可以增加库的重用性。。。
iambic 2007-06-19
  • 打赏
  • 举报
回复
我不知道你的程序是干什么的,反正改后的可以跑,结果对错再说吧……
iambic 2007-06-19
  • 打赏
  • 举报
回复

#include <iostream>
#include <string>
using namespace std;

const int n=10;
struct Person
{
string name;
int count;
}Leader[n];

void Election(Person Leader[],int n)
{
string name;
cout<<"请输入候选人名:";
cin>>name;
while(name!="#")
{
for(int i=0;i<n;i++)
if(Leader[i].name==name)Leader[i].count++;
cout<<"请输入:";
cin>>name;
}
for(int i=0;i<n;i++)
cout<<Leader[i].name<<"得票数为,"<<Leader[i].count<<endl;
}

int main()
{
Election(Leader,n);
}
t0nsha 2007-06-19
  • 打赏
  • 举报
回复
真的不太懂……
哪位大哥能否给我具体改一下啊?
(改成一个完整的、可以成功运行的程序)
谢了!
Jacky0906 2007-06-16
  • 打赏
  • 举报
回复
很明显,没有分配内存
pressmam 2007-06-16
  • 打赏
  • 举报
回复
使用指针试一定要注意分配和释放内存
  • 打赏
  • 举报
回复
都C++ 了为啥不用string
lightnut 2007-06-16
  • 打赏
  • 举报
回复
char* name;
===========
没有分配内存
ljmsxx 2007-06-16
  • 打赏
  • 举报
回复
为什么不把name定义成string?

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧