当前位置:主页   - 电脑 - 程序设计 - C/C++
重解几道华为经典C语言面试题
来源:网络   作者:佚名   更新时间:2011-10-26
收藏此页】    【字号    】    【打印】    【关闭

  1、找错

 void test1()
{
    char string[10];
    char* str1="0123456789";
    strcpy(string, str1);
}

   这里string数组越界,因为字符串长度为10,还有一个结束符‘’。所以总共有11个字符长度。string数组大小为10,这里越界了。

   PS:使用strcpy函数的时候一定要注意前面目的数组的大小一定要大于后面字符串的大小,否则便是访问越界。

void test2()
{
    char string[10], str1[10];
    for(i=0; i<10;i++)
    {
       str1[i] ='a';
    }
    strcpy(string, str1);
}

   这里有一个一眼就能看出的问题,那就是变量i没有定义,这在代码编译阶段编译器可以帮你发现,很容易搞定。然而很多问题是自己造成的漏洞,编译器是帮不上什么忙的。这里最大的问题还是str1没有结束符,因为strcpy的第二个参数应该是一个字符串常量。该函数就是利用判断第二个参数的结束符来得到是否拷贝完毕。所以在for循环后面应加上str1p[9] = ‘’;

   PS:字符数组和字符串的最明显的区别就是字符串会被默认的加上结束符‘’。

 void test3(char* str1)
{
    char string[10];
    if(strlen(str1)<=10)
    {
       strcpy(string, str1);
    }
}

   这里的问题仍是越界问题。strlen函数得到字符串除结束符外的长度。如果这里是<=10话,就很明显越界了。

   小结:上面的三个找错的函数,主要是考查对字符串和字符数组的概念的掌握以及对strcpy函数和strlen函数的理解。

其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明