日期:2014-05-16  浏览次数:20697 次

为什么输出的结果比预期的要多????
代码如下:

strncpy(ch,fname,15);
printf( "%s|\n ",ch);

输出结果如下:

TYSG09720070327ÿ|

为什么输出的结果不是15位我预期的结果是
TYSG09720070327|

问题到底处在哪里呢???
后面的ÿ是怎么回事????

------解决方案--------------------
strncpy并不能总是保证目标一定是以0结束的字符串,它只是忠实地复制n个字符而已。有时候你需要手工添加一个0。

strncpy的说明如下:
如果src的前n个字节不含NULL字符,则结果不会以NULL字符结束。
如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。
src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。

------解决方案--------------------
至于那个“y上面有两个点”的字符是ASCII码大于127的字符,未初始化的内存空间的内容是不可预测的。
------解决方案--------------------
上面也解释了,但写这种程序的时候一定要注意结尾加 '\0 '.
比如:
1,可以在调用strncpy之前先将ch全部清零:
memset (ch, 0, 16);
2,也可以在调用strncpy 后:ch[15]=0;
------解决方案--------------------
自己在结尾加‘\0 '