试题1:
- Void test1()
- {
- char string[10];
- char* str1="0123456789";
- strcpy(string, str1);
- }
[color=rgb(51, 102, 153) !important]复制代码
试题2:
- Void test2()
- {
- char string[10], str1[10];
- for(i=0; i<10;i++)
- {
- str1 ='a';
- }
- strcpy(string, str1);
- }
[color=rgb(51, 102, 153) !important]复制代码
试题3:
- Void test3(char* str1)
- {
- char string[10];
- if(strlen(str1) <= 10)
- {
- strcpy(string, str1);
- }
- }
[color=rgb(51, 102, 153) !important]复制代码
解答:
test1: 字符串str1需要11个字节才能存放下(包括末尾的'\0'),而string只有10个字节的空间,strcpy会导致数组越界
test2: 如果面试者指出字符数组str1不能在数组内结束可以给3分;如果面试者指出strcpy(string, str1)调用使得从str1内存起复制到string内存起所复制的字节数具有不确定性可以给7分,在此基础上指出库函数strcpy工作方式的给10分
test3: if(strlen(str1) <= 10)应改为if(strlen(str1) < 10),因为strlen的结果未统计'\0'所占用的1个字节
剖析:
考查对基本功的掌握:
(1)字符串以'\0'结尾;
(2)对数组越界把握的敏感度;
(3)库函数strcpy的工作方式,如果编写一个标准strcpy函数的总分值为10,下面给出几个不同得分的答案:
2分
- void strcpy( char *strDest, char *strSrc )
- {
- while( (*strDest++ = * strSrc++) != '\0' );
- }
[color=rgb(51, 102, 153) !important]复制代码
4分
- void strcpy( char *strDest, const char *strSrc )
- //将源字符串加const,表明其为输入参数,加2分
- {
- while( (*strDest++ = * strSrc++) != '\0' );
- }
[color=rgb(51, 102, 153) !important]复制代码
7分
- void strcpy(char *strDest, const char *strSrc)
- {
- //对源地址和目的地址加非0断言,加3分
- if (strDest == NULL) && (strSrc == NULL)
- return ;
- while( (*strDest++ = * strSrc++) != '\0' );
- }
[color=rgb(51, 102, 153) !important]复制代码
10分
- //为了实现链式操作,将目的地址返回,加3分!
- char * strcpy( char *strDest, const char *strSrc )
- {
- if (strDest == NULL) && (strSrc == NULL)
- return NULL;
- char *address = strDest;
- while( (*strDest++ = * strSrc++) != '\0' );
- return address;
- }
[color=rgb(51, 102, 153) !important]复制代码
(4)对strlen的掌握,它没有包括字符串末尾的'\0'。
读者看了不同分值的strcpy版本,应该也可以写出一个10分的strlen函数了,完美的版本为
- int strlen( const char *str ) //输入参数const
- {
- if( strt == NULL ); //断言字符串地址非0
- return -1;
- int len=0;
- while( (*str++) != '\0' )
- {
- len++;
- }
- return len;
- }