基本上,我使用strncpy
截断字符,如果它大于字符数组大小。strncpy不能正确存储字符C
所以,我有以下变量和方法。
char studentName[6];
char colour[5];
char music[7];
strcpy(this->studentName, "null");
strcpy(this->colour, "null");
strcpy(this->music, "null"):
void setName (char* studentName)
{
strncpy(this->studentName, studentName, 6);
this->studentName[6] = '\0'; // SET LAST TO NULL POINTER
}
void setColour (char* colour)
{
strncpy(this->colour, colour, 5);
this->colour[5] = '\0'; // SET LAST TO NULL POINTER
}
void setMusic (char* music)
{
strncpy(this->music, music, 7);
this->music[7] = '\0'; // SET LAST TO NULL POINTER
}
所以,如果我设置了学生的名字Jackson
,它将截断至Jackso
,但是,我的colour
变量将是空白,我music
变量将是null
。
另外,如果我尝试...
void setName (char* studentName)
{
strncpy(this->studentName, studentName, 6);
this->studentName[6-1] = '\0'; // SET LAST TO NULL POINTER
}
void setColour (char* colour)
{
strncpy(this->colour, colour, 5);
this->colour[5-1] = '\0'; // SET LAST TO NULL POINTER
}
void setMusic (char* music)
{
strncpy(this->music, music, 7);
this->music[7-1] = '\0'; // SET LAST TO NULL POINTER
}
,我设置了学生的名字Jackson
我得到这样的Jacksonull
。它将null
添加到末尾
当你声明'studentName [6]'时,有效指示是'[0]'到'[5]'。所以在位置'[6]'处设置''\ 0''是未定义的行为。 – abelenky 2014-12-02 22:29:14
@abelenky,所以即使'this-> studentName [5] ='\ 0'',为什么它仍然会添加先前在这个数组中的null值, '杰克逊' – 2014-12-02 22:35:03
既然你没有向我们展示过什么地方/何时/如何调用setName,setColour和setMusic函数,这很难说。发布更多代码,plz。 – abelenky 2014-12-02 22:36:16