2014-12-02 60 views
0

基本上,我使用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添加到末尾

+2

當你聲明'studentName [6]'時,有效指示是'[0]'到'[5]'。所以在位置'[6]'處設置''\ 0''是未定義的行爲。 – abelenky 2014-12-02 22:29:14

+0

@abelenky,所以即使'this-> studentName [5] ='\ 0'',爲什麼它仍然會添加先前在這個數組中的null值, '傑克遜' – 2014-12-02 22:35:03

+0

既然你沒有向我們展示過什麼地方/何時/如何調用setName,setColour和setMusic函數,這很難說。發佈更多代碼,plz。 – abelenky 2014-12-02 22:36:16

回答

-1

嘗試使用sizeof()而不是原始數字。它允許你改變數組的大小,而不用接觸你的代碼。

您首先複製sizeof(array)-1符號,然後設置索引爲sizeof(array)-1(因爲索引從0開始)到'\0'的最後一個符號。

您的代碼編輯應該是這樣的:

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, sizeof(this->studentName)-1); // Copy n-1 chars 
this->studentName[sizeof(this->studentName)-1] = '\0'; // n is set to null symbol 
} 

void setColour (char* colour) 
{ 
strncpy(this->colour, colour, sizeof(this->color)-1); 
this->colour[sizeof(this->color)-1] = '\0'; 
} 

void setMusic (char* music) 
{ 
strncpy(this->music, music, sizeof(this->music)-1); 
this->music[sizeof(this->music)-1] = '\0'; 
} 
+0

請不要調用''\ 0'是一個「空指針」,它只是整數0.這裏的註釋都是無用的和錯誤的。 – 2014-12-02 22:56:43

+0

「NULL POINTER」應該準備好「空字節」(它不是指針) – 2014-12-02 22:57:10

+0

'sizeof'表達式需要是'this-> studentName'等。 – 2014-12-02 22:57:33

1

這裏(假設Linux平臺上你可能有,如果你在Windows,而不是一定要取是strlcpy執行。)

#include <bsd/string.h> 

char studentName[6]; /* Good to know: Globals are initialized to zero */ 
char colour[5]; 
char music[7]; 

/* Pretty useless function since a single strlcpy call is enough */ 
static size_t setX(char *buf, size_t buflen, const char *new_val) { 
    return strlcpy(buf, new_val, buflen); 
} 

int main(int argc, char **argv) { 
    setX(studentName, 6, "Peter"); /* Please read man page and check return value */ 
} 

現在strlcpy只要長度參數> 0,就保證NUL終止。

+0

@chux Yep錯過了,thx。 – Jite 2014-12-03 09:29:24