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

天做了花了几分钟做了三道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的工作方式


  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值