我在将某些字符复制到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
变量中的任何内容。有没有解决这个问题?
答案 0 :(得分:1)
如果我已正确理解您的问题,您需要的是strncpy()
或memcpy(),它将准确复制n
个字节。
在这里,在给出n
的值时需要小心。如果n
等于提供的目标缓冲区的大小,并且源的前n个字节中没有空字节,则终止空值将没有剩余空间。
所以,IMO,如果你想要准确复制n
个字节,那么将数组定义为n+1
大小,准确复制n
个字节,然后放置一个'\ 0' n
变量[考虑索引从0
开始]。
答案 1 :(得分:0)
是的,你可以。但在这种情况下,必须不必将字符数组用作字符串,即,您不能对其应用任何字符串操作(因为它不是\0
终止并将调用未定义的行为)。
答案 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'
,所以我认为这就是你所需要的。