如何复制确切数量的字符 c 字符串

How to copy exact number of characters c-string

本文关键字:字符 字符串 何复制 复制      更新时间:2023-10-16

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

基本上,如果数组的大小定义为 25,并且用户输入 25 个字符,

它会存储 25 个字符并删除其他 char 数组中的内容,因为它是溢出。

有没有办法将 25 个字符复制到数组中,因为我知道您需要考虑 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] = '';
}
void Customers::setSurname(char *surname)
{
    strncpy(this->surname, surname, SURNAME);
    this->surname[SURNAME - 1] = '';
}
void Customers::setAddress(char *address)
{
    strncpy(this->address, address, ADDRESS);
    this->address[ADDRESS - 1] = '';
}
void Customers::setInformation(char *information)
{
    strncpy(this->information, information, INFORMATION);
    this->information[INFORMATION - 1] = '';
}

上面的代码工作正常,但它复制了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 变量中的任何内容。有解决这个问题的方法吗?

如果我

正确理解了你的问题,你需要的是strncpy()或memcpy(),它将精确地复制n字节。

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

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

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

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

你可以

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

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

等等。

另外,我建议使用memcpy函数,因为它可以精确地复制您需要的字节数

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

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

memcpy不会添加终止'',所以我认为这就是您需要的。