2014-11-09 261 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()和主要功能。