笔试题总结
首先看一下strcpy这个函数:
原型声明:extern char *strcpy(char *dest,char *src);
头文件:string.h
功能:把src所指由NULL结束的字符串复制到dest所指的数组中。
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。
* C语言标准库函数strcpy的一种典型的工业级的'最简实现
* 返回值:
* 返回目标串的地址。
* 对于出现异常的情况ANSI-C99标准并未定义,故由实现者决定返回值,通常为NULL。
* 参数:
* strDeatination
* 目标串
* strSource
* 源串
***********************/
char *strcpy(char *strDestination, const char *strSource);
{
assert(strDestination && strSource);
char *cp=strDestination;
while(*cp++ = *strSource++);
return strDestination;
}
实战一下,下面几个test用于找错:
void test1()
{
char string[10];
char* str1=\"0123456789\";
strcpy(string, str1);
}
答:表面上并且编译都不会错误。但如果string数组原意表示的是字符串的话,那这个赋值就没有达到意图。最好定义为char string[11],这样最后一个元素可以存储字符串结尾符\\\0\;
void test2()
{
char string[10], str1[10];
for(int I=0; I<10;I++)
{
str1[I] =\a\;
}
strcpy(string, str1);
}
答:strcpy使用错误,strcpy只有遇到字符串末尾的\\\0\才会结束,而str1并没有结尾标志,导致strcpy函数越界访问,不妨让str1[9]=\\\0\,这样就正常了。
void test3(char* str1)
{
char string[10];
if(strlen(str1)<=10)
{
strcpy(string, str1);
}
}
答:这又会出现第一道改错题的错误了。strlen(str1)算出来的值是不包含结尾符\\\0\的,如果str1刚好为10个字符+1结尾符,string就得不到结尾符了。可将strlen(str1)<=10改为strlen(str1)<10。