找错Void test1(){char string[10];char* str1="0123456789";strcpy(string, str1);}
答:string 大小不够 str1末尾还有一个'/0'Void test2(){char string[10], str1[10];for(I=0; I<10;I++){str1[i] ='a';}strcpy(string, str1);}
答:字符串没有加’/0’,虽然两个字符数组一样的大,但是没有考虑字符串后面的‘/0,’导致程序出错
Void test3(char* str1){char string[10];if(strlen(str1)<=10){strcpy(string, str1);}}
答:对试题3,if(strlen(str1) <= 10) 应改为if(strlen(str1) < 10),因为strlen的结果未统计'/0'所占用的1个字节。
当没有给字符串留'/0'的位置时候会出现的奇怪错误
int m;
char n[6];
scanf("%d|",&m);
PRintf("%d/n",m);
scanf("%[0-9]|",n);
printf("%d %s",m,n);
以上代码当输入 1|600000|时候会输出
1
0 600000
你会发现第一个参数的值变了。这是为什么么呢?当将第二个参数如下声明就会错误消失
char n[7]; (PS必须留一个位置给'/0'要不然会出现奇怪的错误)
我的理解是'/0'不够造成的内存溢出,而这两个内存单元正好是连续的。'/0'赋值到了m上和'/0'的ASCLL码值刚好是0;
因此我们来做一个实验,我们用最开始的那段代码,即n只有6个内存单元
这时候我们输入 1|6000001|时候会输出
1
49 6000001
可以发现第一个参数的值变成了49;这恰好是ASCLL码上1的值;这当然不是巧合。你可以试试别的参数。当然如果你的第二个参数输个10位长度那么这会更加明显。
这也就是为什么我们公司要写那么多宏定义像如下一样的,在定义时就预留了'/0'的位置。就是为了防止我的小白的错误。
typedef char n[7];
剖析:考查对基本功的掌握:(1)字符串以'/0'结尾;(2)对数组越界把握的敏感度;(3)库函数strcpy的工作方式
新闻热点
疑难解答