首页 > 试题广场 >

从程序健壮性进行分析,下面的 FillUserInfo 函数

[问答题]
从程序健壮性进行分析,下面的 FillUserInfo 函数和 main 函数分别存在什么问题?

#define MAX_NAME_LEN 20
struct USERINFO
{
    int nAge;
    char szName[MAX_NAME_LEN];
};
void FillUserInfo(USERINFO *parUserInfo)
{
    stu::cout << "请输入用户的个数:";
    int nCount = 0;
    std::cin >> nCount;
    for (int i = 0; i < nCount; i++)
    {
        std::cout << "请输入年龄:";
        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[100] = {0};
    FillUserInfo(arUserInfos);
    printf("The first name is:");
    printf(arUserInfos[0].szName);
    printf("\n");
    return 0;
}

推荐
FILLUserInfo函数的问题:
因为结构体USERINFO的成员szName最多容纳20个字节,如果拷贝的名字超过20字节,就超越了数组的边界,引起段错误。
main()函数的问题:
arUserInfos有100个元素,如果在输入的用户个数超过100,那么也会引起该数组的边界越界,同样是段错误

编辑于 2015-01-28 16:22:50 回复(0)
头文件
添加头文件引用 #include <iostream>
添加头文件引用 #include <string.h>
添加头文件引用 #include <cstdio>
语法
stu::cout << "请输入用户的个数:"; // 语法错误 改为:std::cout
std::cin >> parUserInfo[i]->nAge; // 语法错误 改为:parUserInfo[i].nAge
USERINFO arUserInfos[100] = {0}; // warning 改为:USERINFO arUserInfos[100] = {{0}};
异常
当输入的用户个数nCount大于100,则会导致数组越界,操作非法内存区域;
当输入的用户年龄nAge不是整数,则会导致for循环异常退出。
当输入的姓名长度超过20,调用strcpy函数时szName会溢出。
编辑于 2015-08-29 11:58:36 回复(4)
1. FillUserInfo 函数
1)stu::cout 语法错误
2)没有验证parUserInfo的内存有没有分配
3)parUserInfo[i]是具体的对象,而不是指针,不能用指针指向符

2. main函数
1)USERNIFO的初始化错了
2) printf(arUserInfos[0].szName)这个语法错了
发表于 2015-04-17 22:09:42 回复(0)
FillUserInfo中,1, nCount应小于100; 2,应为std::cin >> parUserInfo[i].nAge; 3,std::cin >> strName长度小于20;
main中,arUserInfos初始化加内部花括号;
发表于 2015-12-20 21:40:38 回复(0)
<div> FillUserInfo 函数中,strcpy可能越界访问内存; </div> <div> main 函数中,第2个printf中没有格式限定符; </div>
发表于 2015-09-05 20:33:22 回复(0)
<div> 1、输入的用户个数与函数传入的arUserInfos[]长度可能会不一致,可以改为:nCount=sizeof(<span>*parUserInfo</span>)/ sizeof(<span>parUserInfo[0]</span>); </div> <div> 2、strcpy的时候没有检查字符串的长度,如果输入的字符个数大于(<span>MAX_NAME_LEN-1)</span>可能存在越界 </div> <pre class="prettyprint lang-xml">3、main函数中调用函数FillUserInfo(arUserInfos),是将arUserInfos的首地址传给形参parUserInfo,parUserInfo是局部变量,在函数调用结束后其所指的内存区域将被回收,main函数内将得不到想要的值</pre> <br />
发表于 2015-09-05 10:59:53 回复(0)
<div> main函数中存在的问题: </div> <div> arUserInfos的初始化存在问题,对于一个结构体要么不初始化,要么需要对每一个成员采用初始化的方式; </div> <div> <br /> </div> <div> <span>FillUserInfo函数存在的问题:</span> </div> <div> <span>1.</span><span>&nbsp;</span><span>nCount个数大于100个的时候,数组会越界,可以限定;</span> </div> <div> <span>2.&nbsp;</span><span>strName转换到</span><span>szName的时候,如果前面的字符超过了20个,也会出现数组越界的问题,可以采用strncpy,限定复制的字符数;</span> </div> <div> <span>3.</span><span>std::string strName;这行代码虽然没有什么问题,但是每一次循环,都会导致不必要的构造,析构操作,完全可以放到循环外面,然后每一次清空处理;</span> </div> <div> <span><br /> </span> </div>
发表于 2015-09-05 10:50:13 回复(0)
(L9) stu::cout << "请输入用户的个数:";这个是笔误吗?而且这之前首先要对指针判空parUserInfo == NULL
(L11) 需要对输入的nCount进行限制,0 <= nCount <= 100
(L15) 年龄要输入合法,需要限定一个范围
(L18) 其实名字的输入长度是有限制的,另外需要检测名字的合法性(不能有特殊字符等)
(L19) strcpy进行复制不包括最后的'\0',szName的最后需要手动添加'\0'
(L27) nCount如果输入不合法或者为0,这里对arUserInfos[0].szName的打印会出错;
发表于 2015-09-04 10:11:00 回复(0)
1)FillUserInfo函数:
std::cin >> parUserInfo[i]->nAge; 错误==》改成 std::cin >> parUserInfo[i].nAge;
未检测: std::cin >> nCount;   nCount<=100;
未检测: std::cin >> strName; 确保 strlen(strName)<20;


发表于 2015-08-27 20:16:35 回复(0)
yst头像 yst
没有检查输入的用户个数和用户名的大小是否超出了数组的大小数组是否越界。应该使用动态内存分配的方式来解决此问题。
发表于 2015-07-05 15:43:06 回复(0)
FillUserInfo函数的问题:1.结构体USERINFO的成员szName最多能容纳20个字节,如果strcpy函数拷贝的字节超过20,就超越了数组的边界,引起段错误。
2.td::cout << "请输入年龄:";      std::cout << "请输入姓名:";  这部分都没有进行输入检验,如果输入不合法,函数将会发生错误。

main函数的问题:arUserInfos则限制为100个元素,如果在输入的用户个数超过100,那么也会引起该数组的边界越界,引起段错误。
 两个函数都应该考虑用new和delete动态分配内存.

发表于 2015-03-31 22:54:08 回复(0)
#include"string.h"
#include<stdlib.h>
#include<stdio.h>
main()
{
char*src="hello,world";
char*dest=NULL;
int len=strlen(src);
dest=(char*)malloc(len+1);
char*d=dest;
char*s=&src[len-1];
while(len--!=0)

*d++=*s--;
*d=0;
printf("%s",dest);
free(dest);
dest=NULL;
return 0;
}  
发表于 2015-03-20 16:16:25 回复(0)
fsdaf
发表于 2014-12-22 14:12:09 回复(0)
USERINFO *parUserInfo 指针未判断有效,
nCount未检查有效性,应小于100
strName未对有效长度判断,不能超过MAX_NAME_LEN
 printf(arUserInfos[0].szName);未加打印类型%s
 strcpy(parUserInfo[i].szName, strName.c_str()); 未加拷贝长度 strName.size();
发表于 2014-12-20 14:13:14 回复(1)
1 void FillUserInfo(USERINFO *parUserInfo) 中parUserInfo大小不知道,可能越界,建议入参同时传入 parUserInfo数组大小
2  strcpy(parUserInfo[i].szName, strName.c_str());  可能越界,建议用strncpy
printf(arUserInfos[0].szName);  printf("%s", arUserInfos[0].szName);
发表于 2014-12-07 14:25:28 回复(0)
eeeeeeeeeeee
发表于 2014-11-04 11:48:33 回复(0)