您的位置:首页 > 编程语言 > C语言/C++

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++