//腾讯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++面试题分析
最新推荐文章于 2024-08-28 21:53:44 发布