在不使用字符串函数的情况下复制c ++中的字符数组

时间:2012-10-18 20:37:25

标签: c++ g++

任何人都可以帮我解决这个问题.. 我想要做的就是复制显示在main函数中初始化的字符数组 我对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'中的任何一个都不匹配

     

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

     

copychar.cpp:54:13:错误:'const char * base1 :: getpubl()const'的原型与类'base1'中的任何一个都不匹配

     

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

     

copychar.cpp:58:13:错误:'const char * base1 :: getauth()const'的原型与类'base1'中的任何一个都不匹配

     

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;
}

6 个答案:

答案 0 :(得分: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是char,然后你说它是const char*const。你必须保持一致。第二个是正确的,替换

char getname();

const char* getname() const;

与getauth和getpubl相同。

答案 1 :(得分:1)

getter函数的原型不匹配。 你已经将getters声明为..

char getname();

你实现它就像这样。

const char* base1::getauth() const

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

const char* getauth() const ;

并像这样实现它。

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

同样适用于所有getter函数。

答案 2 :(得分:1)

  • 逐一纠正编译错误
    • 仔细阅读每个错误
    • 检查google /编译器文档,如果不理解
    • 仍然不明白 - 然后要求这个非常错误 - 在你的情况下它意味着什么
  • 对您的代码进行单元测试
  • 当你的程序不通过单元测试(并且它不会)调试你的代码并逐一纠正逻辑错误时

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

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

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

答案 3 :(得分:0)

  • 使用char *参数的setXXX函数可能会改为const char*
void setname(const char *name);
  • 您的getXXX函数被声明为缺少const限定符,但定义为const
  • 您的getXXX函数声明为返回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()
{}

答案 4 :(得分:-1)

你必须在论证上做点什么:

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

所有方法都是一样的

答案 5 :(得分:-1)

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

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

因此,请复制,直到输入为空字符,或者目标数组已满。