如何复制c-string的确切字符数

时间:2014-12-29 12:25:31

标签: c++ arrays char

我在将某些字符复制到c-string数组时遇到了一些困难。

基本上,如果数组的大小定义为25,并且用户输入25个字符,它将存储25个字符并删除其他char数组中的内容,因为它是溢出的。

有没有办法将25个字符复制到数组中,因为我知道您需要考虑\0 null终止字符。

这是我的头文件和代码,

  #define FIRSTNAME 25
  #define SURNAME 128
  #define ADDRESS 128
  #define INFORMATION 128

class Customers
{
private:
    char firstName[FIRSTNAME];
    char surname[SURNAME];
    char address[ADDRESS];
    char information[INFORMATION];


public:
    Customers();

    void setFirstName(char *firstName);
    void setSurname(char *surname);
    void setAddress(char *address);
    void setInformation(char *information);

    const char* getFirstName() const {return firstName;};
    const char* getSurname() const {return surname;};
    const char* getAddress() const {return address;};
    const char* getInformation() const {return information;};

    ~Customers();

};

代码:

void Customers::setFirstName(char *firstName)
{
    strncpy(this->firstName, firstName, FIRSTNAME);
    this->firstName[FIRSTNAME - 1] = '\0';
}

void Customers::setSurname(char *surname)
{
    strncpy(this->surname, surname, SURNAME);
    this->surname[SURNAME - 1] = '\0';
}

void Customers::setAddress(char *address)
{
    strncpy(this->address, address, ADDRESS);
    this->address[ADDRESS - 1] = '\0';
}

void Customers::setInformation(char *information)
{
    strncpy(this->information, information, INFORMATION);
    this->information[INFORMATION - 1] = '\0';
}

上面的代码工作正常但它会复制maximum size - 1字符。

我尝试使用下面的代码来复制最大大小的字符,但它会删除其他变量中的字符...

void Customers::setFirstName(char *firstName)
{
    strcpy(this->firstName, firstName); // IF *firstName is 25 characters, it stores 25 characters and erases what is in the surname variable
}

void Customers::setSurname(char *surname)
{
    strcpy(this->surname, surname); // IF *surname is 128 characters, it stores 128 characters and erases what is in the address variable
}

void Customers::setAddress(char *address)
{
    strcpy(this->address, address); // IF *address is 128 characters, it stores 128 characters and erases what is in the information variable
}

void Customers::setInformation(char *information)
{
    strcpy(this->information, information);
}

如何复制所有字符,即使它是最大尺寸?例如,如果姓氏实际上是128个字符长,我不希望它删除address变量中的任何内容。有没有解决这个问题?

3 个答案:

答案 0 :(得分:1)

如果我已正确理解您的问题,您需要的是strncpy()memcpy(),它将准确复制n个字节。

在这里,在给出n的值时需要小心。如果n等于提供的目标缓冲区的大小,并且源的前n个字节中没有空字节,则终止空值将没有剩余空间。

所以,IMO,如果你想要准确复制n个字节,那么将数组定义为n+1大小,准确复制n个字节,然后放置一个'\ 0' n变量[考虑索引从0开始]。

答案 1 :(得分:0)

是的,你可以。但在这种情况下,必须不必将字符数组用作字符串,即,您不能对其应用任何字符串操作(因为它不是\0终止并将调用未定义的行为)。

要复制该数组,您可以使用循环或标准库函数memcpymemmove

答案 2 :(得分:0)

你可以这样做,但是不要在结果数组上使用任何str*函数,它不是没有终止'\0'字节的字符串。您不能将它们视为字符串,但如果您想将它们存储在文件中,它仍然很有用,只需在使用sizeof运算符复制其内容时指定数组的长度。例如,要将它们写入stdout,您可以

fwrite(array, 1, sizeof(array), stdout);

等等。

另外,我建议memcpy函数,因为它准确复制了你需要的字节数,例如

strncpy(this->information, information, INFORMATION);    

将是

memcpy(this->information, information, INFORMATION);

memcpy不会添加任何终止'\0',所以我认为这就是你所需要的。