程序健壮性
来源:互联网 发布:淘宝店招在线生成 编辑:程序博客网 时间:2024/06/06 07:16
//腾讯QQ2008年笔试题中的附加题(30分)//从程序健壮性进行分析,下面的FillUserInfo函数和main函数分别//存在什么问题?#include <iostream>#include <string>#include <memory>#define MAX_NAME_LEN 20struct 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]->nAgestd::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
- 程序健壮性
- 程序健壮性
- 程序的健壮性
- 程序的健壮性
- 何谓程序的健壮性
- 程序的健壮性
- 程序的健壮性
- setsockopt()改善程序的健壮性
- setsockopt()改善程序的健壮性
- 提高程序健壮性的方法
- setsockopt()改善程序的健壮性
- setsockopt()改善程序的健壮性
- setsockopt()改善程序的健壮性
- setsockopt()改善程序的健壮性
- setsockopt()改善程序的健壮性
- setsockopt()改善程序的健壮性
- 程序的健壮性和鲁棒性
- 程序的健壮性和鲁棒性
- 人有疑问可以google、百度,那机器人有问题是否也可以呢?—云机器人是一堆机器人嘛?
- leetcode总结无止境系列之链表
- 笔记05 嵌套循环和递归调用
- Windows CE 设备应用程序里动态引用webservice
- 杭电1176 免费馅饼(数塔dp)
- 程序健壮性
- JAVA 实现XML与JSON 相互转换
- poj 1925
- hdu 3915 Game
- 为什么使用Qt而不是MFC
- 机房收费系统——初画类图(2)
- [数位dp] hdu 4722 Good Numbers
- 南宁玻尿酸丰太阳穴哪家好
- 曾經的小屋