C++常见面试题(一)——关于字符、字符数组、assert()

来源:互联网 发布:淘宝韩版男装店铺 编辑:程序博客网 时间:2024/06/01 08:33

        今天在牛客网上看招聘,选择“研发工程师(C/C++方向)”,列出了基础知识体系及结构,包含C/C++、网络基础、操作系统、linux、数据库、数据结构。我的天呐,包含的内容体系这么多,这可不是两三个月突击就可以搞定的!好好加油吧孩子~

      好,今天先看几道题目吧。

      1、分析下面代码有问题

void test1(){ char string[10]; char* str1 = "0123456789"; strcpy( string, str1 );}
      分析:显然有问题。编译器在编译字符串时,会自动在每个字符串的结尾处加上一个空字符(‘\0’),所以,str1指向的是11个元素,而字符数组里面只有10个空间,显然不能拷贝。这里补充说明一点,字符 ‘A’,就是个单独的字符 A,而字符串 “A”包含两个字符,一个是字母A,另一个是\0;

    2、分析下面代码的问题

void test2(){ char string[10], str1[10]; int i; for(i=0; i<10; i++) { str1  = 'a'; }strcpy( string, str1 );}
      分析:显然有问题。str1= 'a'; 根本编译不过去。数组名都是 char * const类型的,为右值,不允许赋值。同理,str1++也是不允许的。此外,还存在一个安全隐患,strcpy f复制的时候,如果不能遇到’\0‘,就一直复制下去,所以,很容易导致数组越界。

      完美的改法如下:

void main(){    char string[10], str1[10];    int i;    for(i=0; i<9; i++)    {        str1[i]  = 'a';    }    str1[9] = '\0';    strcpy( string, str1 );}
      3、指出代码错误

void test3(char* str1){ if(str1 == NULL){        return ; } char string[10]; if( strlen( str1 ) <= 10 ) { strcpy( string, str1 ); }}
      分析:因为string 数组大小为10,如果 str 长度为10了,加上一个 ’\0‘,就变成11个了
      4、写出完整版的 strcpy( )函数
      看到下面的答案,感觉自己弱爆了。

      断言assert( )不是函数,而是宏。它是在头文件 <assert.h>里面的。如果它的条件返回错误,那么,程序终止执行。

原创粉丝点击