1

谁能帮我解决这个代码..我要做的就是复制显示在主函数中初始化的字符数组对cpp来说很新,我想不出办法

#include<iostream>
using namespace std;

class base1
{
public:
void setname(char *name);
void setpubl(char *publisher);
void setauth(char *author);
char getname();
char getpubl();
char getauth();
private:
char init_name[50], init_publ[50], init_auth[50];

};

void base1::setname(char *name)
{
int i=0;
while(init_name[i] != '\0')
{
init_name[i]=name[i];
i++;
}
}

void base1::setpubl(char *publisher)
{
int j=0;
while(init_publ[j] != '\0')
{
init_publ[j]=publisher[j];
j++;
}
}

void base1::setauth(char *author)
{
int k=0;
while(init_auth[k] != '\0')
{
init_auth[k]=author[k];
k++;
}

}

const char* base1::getname() const
{
return init_name;
}

const char* base1::getpubl() const
{
return init_publ;
}
const char* base1::getauth() const
{
return init_auth;
}
/*
base1::base1()
{
init_name[0]=0;
init_publ[0]=0;
init_auth[0]=0;
}*/

int main()
{
base1 hello;
char name[]="cpp";
char publisher[]="dreamworks";
char author[]="random";
hello.setname(name);
hello.setpubl(publisher);
hello.setauth(author);
cout<<hello.getname()<<endl;
cout<<hello.getpubl()<<endl;
cout<<hello.getauth()<<endl;
return 0;
}

当我尝试编译它时,它给了我很多错误。有人可以帮我吗。我正在使用 g++

错误:

copychar.cpp:49:13:错误:'const char* base1::getname() const' 的原型与类'base1'中的任何内容都不匹配</p>

copychar.cpp:10:6:错误:候选是:char base1::getname()

copychar.cpp:54:13:错误:'const char* base1::getpubl() const' 的原型与类'base1'中的任何内容都不匹配</p>

copychar.cpp:11:6:错误:候选是:char base1::getpubl()

copychar.cpp:58:13:错误:'const char* base1::getauth() const' 的原型与类'base1'中的任何内容都不匹配</p>

copychar.cpp:12:6:错误:候选是:char base1::getauth()

当我使用以下代码时,仅显示每个字符串的第一个字符

#include<iostream>
using namespace std;

class base1
{
public:
void setname(char *name);
void setpubl(char *publisher);
void setauth(char *author);
char getname();
char getpubl();
char getauth();
private:
char init_name[50], init_publ[50], init_auth[50];

};

void base1::setname(char *name)
{
int i=0;
while(name[i] != '\0')
{
init_name[i]=name[i];
i++;
}
}

void base1::setpubl(char *publisher)
{
int j=0;
while(publisher[j] != '\0')
{
init_publ[j]=publisher[j];
j++;
}
}

void base1::setauth(char *author)
{
int k=0;
while(author[k] != '\0')
{
init_auth[k]=author[k];
k++;
}

}

char base1::getname()
{
return *init_name;
}

char base1::getpubl()
{
return *init_publ;
}
char base1::getauth()
{
return *init_auth;
}
/*
base1::base1()
{
init_name[0]=0;
init_publ[0]=0;
init_auth[0]=0;
}*/

int main()
{
base1 hello;
char name[]="cpp";
char publisher[]="dreamworks";
char author[]="random";
hello.setname(name);
hello.setpubl(publisher);
hello.setauth(author);
cout<<hello.getname()<<endl;
cout<<hello.getpubl()<<endl;
cout<<hello.getauth()<<endl;
return 0;
}
4

6 回答 6

1

你的循环是错误的,不是

void base1::setpubl(char *publisher)
{
    int j=0;
    while(init_publ[j] != '\0')
    {
        init_publ[j]=publisher[j];
        j++;
    }
}

void base1::setpubl(char *publisher)
{
    int j=0;
    while(publisher[j] != '\0')
    {
        init_publ[j]=publisher[j];
        j++;
    }
    init_publ[j] = '\0'; // ensure destination string is null terminated
}

您的循环应该检查publisher您传递给函数的字符串的结尾,而不是init_publ字符串的结尾。这没有多大意义,因为你还没有给那个字符串一个值。

其他循环也一样。

也看看这个

char getname();

还有这个

const char* base1::getname() const

看到不同?首先你说 getname is char,然后你说它是const char*and const。你必须保持一致。第二个是正确的,替换

char getname();

const char* getname() const;

与 getauth 和 getpubl 相同。

于 2012-10-18T20:41:39.667 回答
1

您的函数原型getter不匹配。您已将吸气剂声明为..

char getname();

你像这样实现它。

const char* base1::getauth() const

使他们的原型相同,就像这样。

const char* getauth() const ;

并像这样实现它。

const char* base1::getauth() const
{
  //code here
}

同样适用于所有getter功能。

于 2012-10-18T20:48:25.737 回答
1
  • 一一纠正你的编译错误
    • 仔细阅读每一个错误
    • 如果不理解,请检查 google/compiler 文档
    • 仍然不明白-然后问这个错误-在您的情况下是什么意思
  • 单元测试你的代码
  • 当您的程序无法通过单元测试(也不会)时,调试您的代码并一一纠正逻辑错误

每次你必须写东西时运行这些步骤。这是提高你的编程技能的最好方法——来自他人的好建议和好的讲座是不够的。

我可以给你一些提示 - 但这对未来有帮助吗?对于不那么明显的错误?

一个提示:char 字符串必须以 结尾'\0',复制后您的字符串是否包含最后一个字符?

于 2012-10-18T20:50:14.863 回答
0
  • 您的 setXXX 采用char *参数的函数可能应该采用const char*
void setname(const char *name);
  • 您的 getXXX 函数被声明为缺少const限定符,但定义为const.
  • 您的 getXXX 函数被声明为返回 a char,但定义正在返回const char*
const char* getname() const;
  • 您的 setXXX 函数正在检查目标而不是源中的空终止符,导致它们根本不复制任何字符。
  • 您的 setXXX 函数可能应该使用 for 循环而不是while循环
  • 您根本不进行缓冲区溢出检查。
void base1::setname(const char *name) 
{
  int i=0;
  for( ; name[i]!='\0' && i<49; ++i)
    init_name[i]=name[i];
  init_name[i] = '\0';  
}
  • 您的类没有构造函数,因此成员可能会随机初始化
base1::base1()
:init_name(), init_publ(), init_auth()
{}
于 2012-10-18T20:42:28.097 回答
-1

你必须在论点上做 while 事情:

void base1::setpubl(char *publisher)
{
     int j=0;
     while(publisher[j] != '\0')
     //...

你所有的方法都是一样的

于 2012-10-18T20:42:13.007 回答
-1

使用字符串函数,这就是它们的用途(除非这是你的作业,在这种情况下,这不是 SO 的用途)

但是,您的主要问题是,当您将数据复制到类数组时,当目标数组为空时您会停止 - 在大多数 C++ 环境中,声明一个数组不会用空值初始化它,大多数时候您不想要性能只是为了空白一个你将填充真实数据的数组。

所以复制直到输入是一个空字符,或者目标数组已满。

于 2012-10-18T20:42:39.113 回答