c++面试题分析
2016-09-23 17:23
113 查看
//腾讯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(); // //************************************************************************
相关文章推荐
- C/C++程序员应聘时常见的面试题和分析答案(三)
- c/c++程序员常见面试题分析(转)
- C/C++程序员应聘时常见的面试题和分析答案(一)
- 【C/C++】关于隐式转换·面试题分析
- c++面试题(分析)
- C/C++常考面试题(一):代码分析
- C/C++程序员应聘时常见的面试题和分析答案(二)
- 从一道面试题分析c++的多态特性
- C++面试题--(一)
- C++面试题--(二)
- C++面试题--(四)
- 利用ANTLR生成C++描述的分析程序
- C++中函数中参数和返回值都是用户定义类型(这里主要是类的情况时的分析)
- CppEval - 一个 C++ 的表达式分析库
- 全面整理的C++面试题
- C++面试题--(五)
- C/C++程序员应聘常见面试题深入剖析(2)
- C++面试题( 收集并整理)
- C++ 的词法分析
- C++ 栈类实力 代码分析