华为经典C语言面试题(一)

来源:互联网 发布:网络分销代理 编辑:程序博客网 时间:2024/05/22 00:48

 1、找错

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


 
   
这里string数组越界,因为字符串长度为10,还有一个结束符‘\0’。所以总共有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] = ‘\0’;

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

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


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

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

原创粉丝点击