在VRP平台中,实现了strncpy类似的函数,定义如下
1: #define CHAR char
2: #define ULONG unsigned long
3: #define VOID void
4:
5: #define MACRO_COPYWORLDLENGTH 4
6:
7: CHAR *VOS_strncpy(CHAR *pcDest, const CHAR *szSrc, ULONG ulLength)
8: {
9: CHAR *pcPoint=pcDest;
10:
11: if((NULL==szSrc)||(NULL==pcDest))
12: {
13: return NULL;
14: }
15:
16: while(ulLength && (*pcPoint=*szSrc))
17: {
18: pcPoint++;
19: szSrc++;
20: ulLenght--;
21: }
22: if(!ulLength)
23: {
24: *pcPoint='/0';
25: }
26: return pcDest;
27: }
28:
29: void main(void)
30: {
31: CHAR szStrBuf[] ="1234567890";
32: CHAR szStrBuf1[]="1234567890";
33: CHAR *szHelloWorld = "Hello World!"
34: strncpy(szStrBuf, szHelloWorld, MACRO_COPYWORLDLENGTH);
35: VOS_strncpy(szStrBuf1, szHelloWorld, MACRO_COPYWORLDLENGTH);
36: printf("%s %s", szStrBuf, szStrBuf1);
37: }
程序的输出结果是_____
【分析与解答】
这个程序考察的是对C字符串处理内部机制的了解情况。
cstring一族中: strlen(const char* str) 返回的是字符串的长度,不包含 ‘/0’
所以对strcpy的调用我们一般都是 :
char * copy = new char[strlen(src)+1];
strncpy(copy,src,strlen(src)); // strncpy 如果没有指定长度,那么同样也是不会复制’/0’的
copy[strlen(src)+1]=’/0’
为什么会不去复制’/0’呢?
因为cstring库是memory.h库的底层实现,也就是说memcpy函数的底层实现是由unsigned char 类型的strncpy实现的,所以如果加上了NULL
那么就会发生内存的截取,从而会导致的程序退出时,不能完全的删除内存(NULL后面的部分没有删除),就会内存泄露,所以在标准库里面的
strncpy是没有NULL的
下面是某标注库的memory.h的定义:
1: /*
2: * This file is part of the Mingw32 package.
3: *
4: * memory.h maps to the standard string.h header.
5: */
6:
7: #include
有了这个知识点,就很容易解答上面的程序了
第一个输出,使用的是strncpy,所以只是起到了内存的覆盖的作用,输出是覆盖掉前4个字符的字符串 Hell567890
第二个输出,调用了我们自己的程序,其中使用了字符串截断符NULL,所以输出的结果是前四个字符 Hell
【答案】 Hell1234567890 Hell