c++面试题分析

    //腾讯QQ2008年笔试题中的附加题(30分)  
    //从程序健壮性进行分析,下面的FillUserInfo函数和main函数分别  
    //存在什么问题?  

    #include <iostream>  
    #include <string>  
    #include <memory>  

    #define MAX_NAME_LEN 20  

    struct USERINFO  
    {  
        int nAge;  
        char szName[MAX_NAME_LEN];  
    };  

    void FillUserInfo(USERINFO* parUserInfo)  
    {  
        std::cout<<"请输入用户的个数:";  

        int nCount=0;  
        std::cin>>nCount;  

        for(int i=0;i<nCount;i++)  
        {  
            std::cout<<"请输入年龄:";  
            //原先是这样的  
            //std::cin>>parUserInfo[i]->nAge  
            std::cin>>parUserInfo[i].nAge;  

            std::string strName;  
            std::cout<<"请输入姓名:";  
            std::cin>>strName;  
            strcpy(parUserInfo[i].szName,strName.c_str());  
        }  
    }  

    int main(int argc,char* argv[])  
    {  
        //USERINFO arUserInfos[2]={0};  
        USERINFO arUserInfos[2];  
        ZeroMemory(arUserInfos, sizeof(arUserInfos));  

        FillUserInfo(arUserInfos);  

        printf("The first name is:");  
        printf(arUserInfos[0].szName);  
        printf("\n");  

        return 0;  
    }  

    //********************************************************************  
    // 百度知道上某牛人给的解答:  
    // 1:函数入口未验证.要防止FillUserInfo(USERINFO* parUserInfo)的  
    //   参数指针是【非法指针】。  
    //   入口验证可以这样写:ASSERT(parUserInfo);  
    //   或:  
    //   if(parUserInfo == NULL){return;}  
    // 2:从设计的角度来说,把数据长度的限定和数据传递值分开是非常危险的。  
    //   比如FillUserInfo(USERINFO* parUserInfo)我传了USERINFO arUserInfos[100]  
    //   进去,里面输入nCount的时候我输入101呢?一般来说应该FillUserInfo(USERINFO*   
    //   parUserInfo,int nSize);传入一个需要赋值的长度参数.而且你在函数里面也无法  
    //   计算parUserInfo的长度.  
    // 3:将std::string赋值给【C风格字符串】是十分危险的。string是动态开辟内存,  
    //   【长度是无限的】。如果超过C风格数组的长度即MAX_NAME_LEN很容易造成栈溢出  
    //    或内存访问崩溃。如需这样用.请用strncpy(parUserInfo[i].szName,strName.c_str(),20);  
    // 4:一个细节.for(int i=0;i<nCount;i++)  
    //   虽然C++支持定义时使用,但不建议这么写。不同版本的编译器对此理解不同,不利于  
    //   扩展和向上升级。微软建议还是用  
    //   int i = 0 ;  
    //   for(i=0;i<nCount;++i)  
    // 5:USERINFO arUserInfos[100]={0};结构体赋值不建议这么做。  
    //   有两种推荐的安全做法  
    //   1--构造函数初始化.  
    //   2--ZeroMemory(arUserInfos,sizeof(arUserInfos)); 调用memset置零  
    // 6:混用printf和cout,cin也是不好的,虽然不会有危险,但是其使用不同的缓冲流可能  
    //   存在输出顺序混乱的问题  
    //************************************************************************  

    //************************************************************************  
    // 【关于c_str()函数的学习】  
    // 1,C语言中没有string类型,C++中为了与C语言兼容,使用string类对象的  
    //    成员函数c_str()把string对象转换成C中的字符串样式  
    //    注意:一定要使用strcpy()函数等操作c_str()返回的指针  
    //    原因:c_str函数的返回值是const char *的,不能直接赋值给char *  
    //    包含的头文件:<cstring>  
    // 2,最好不要这样写:  
    //    char *c;  
    //    string s = "1234";  
    //    c = s.c_str();  
    //      
    //************************************************************************  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值