2014-11-09 282 views
-1

有沒有辦法在處理c樣式字符串或char數組時正確處理NUL字符?在處理char數組時處理NULL char的正確方法

int myint; 
char stringa[4];    
memset(stringa, 0x0, 4); 
memset(stringa, ' ', 3); 

stringa = getValueS(); 
myint = getValue(); 

char stringint[4]; 
memset(stringint, 0x0, 4); 
memset(stringint, ' ', 3); 

itoa(myint, stringint, 10); 

char finals[7]; 
memset(finals, 0x0, 7); 
memset(finals, ' ', 6); 

memcpy(&finals[3], stringint, 3); 
memcpy(&finals[0], stringa, 3); 

決賽給出 「0」

stringint給出 「0」

stringa給出 「0」

預期收益 「0」

+1

「0」!= NULL。 ''\ 0''是char數組中的空字符,不能打印出來,因爲它是一個NULL字符 - 沒有什麼可打印的。 – 2014-11-09 00:35:40

+0

你的意思是「0x0」!= NULL? – lock 2014-11-09 00:37:26

+0

是的,這正是我的意思。字符數組中的NULL字符是'\ 0',就像我在上一條評論中所寫的那樣。我不確定我在這裏不清楚。 '0x0'!='\ 0',要麼。 '((0x0 == 0)&&(0x0!='\ 0'))' – 2014-11-09 00:38:20

回答

1

的問題是,想要處理它。這是沒有必要的。 itoa函數爲你做這個。存儲在數組中的字符串作爲參數傳遞NUL終止。

小心,itoa不是一個標準函數,所以你的代碼可能不是可移植的。你可以寫一個自定義itoa。

現在,關於你的代碼的幾句話:

  1. 用零填充可能會解決這個問題NUL陣列,雖然是不好的做法。管理該陣列中的數據的功能必須確保存在NUL終止符,而不管陣列的內容如何(請參閱strcpy之類的函數)。

  2. 用空格填充字符沒有意義。

  3. 我不知道getValueS()在做什麼,但它似乎返回一個指向char的指針(至少你將結果賦給一個指向char的指針)。如果是這樣的話,您對stringa所做的初始化是無用的,因爲它會指向另一個內存位置(因此您不能再訪問您的陣列)。

如果我的回答不夠清晰,請添加更多的信息:發佈完整的代碼,包括的聲明getValue()getValueS()和主要功能。