C语言面试题之字符串操作

来源:互联网 发布:中国移动大数据 编辑:程序博客网 时间:2024/05/18 14:45
天做了花了几分钟做了三道C语言面试题,跟大家分享一下:

找错
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的工作方式


2 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 模拟人生4小人生病了怎么办 创造与魔法死后怎么办? 脚不小心扭伤了该怎么办 小鸡脚扭伤了该怎么办 跳高比赛最终成绩相等怎么办 热车1200怠速降不下来怎么办 大腿根骨髓水肿越来越疼怎么办 倒库方向打晚了怎么办 签吻芳颜祛斑液脸脱皮怎么办 3d右边工具栏消失了怎么办 3d菜单栏消失了怎么办 觉得自己性无能不敢谈对象怎么办 护士面试时被问到病人坠床怎么办 三次元仪器坏了怎么办 运动同手同脚怎么办 狗狗突然害怕不敢走路怎么办 一岁半宝宝因为害怕不敢走路怎么办 猫把背拱起来怎么办 穿猫跟鞋走路不稳怎么办 狗狗后腿内八字怎么办 快走后小腿粗了怎么办? 猫的嘴巴烂了怎么办 苹果8丢了已关机怎么办 肚子吃多了难受怎么办 喝水喝的肚子胀怎么办 肚子吃撑了难受怎么办 肚子撑得想吐怎么办 吃饭吃的太饱怎么办 吃饭吃的太撑怎么办 跑步迈不开步子怎么办 踏步走步子反了怎么办 微信不支持计步怎么办 肝癌二次介入后头晕心慌怎么办 跑步跑得胃疼怎么办 如果世界上的猪都死了怎么办 我和我老婆吵架怎么办 我和我老婆吵架了怎么办 智障人士父母死后怎么办 依赖性太强的人怎么办 高考只有一门写准考证号怎么办 ps做动画不流畅怎么办