腾讯QQ2008年笔试题中的附加题(30分)

//腾讯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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值