如题:
cout<<"\n-----------------------------\n";
cout<<"\n请输入你要添加的学生信息\n";
cout<<"学号:";
cin>>student.snum;
cout<<"\n姓名:";
cin>>student.sname;
cout<<"\n年龄:";
     cin>>student.sage;
cout<<"\n性别:";
cin>>student.ssex;
cout<<"\n专业:";
cin>>student.smajor; //m_pRecordset->MoveFirst();//移动到第一条记录
m_pRecordset->MoveLast();//移动到第一条记录
m_pRecordset->AddNew();//添加新记录
m_pRecordset->PutCollect("bianm",_variant_t(student.snum));
cout<<student.sname<<endl;
m_pRecordset->PutCollect("xingm",_variant_t(student.sname));
m_pRecordset->PutCollect("nianl",_variant_t(student.sage));
m_pRecordset->PutCollect("xingb",_variant_t(student.ssex));
m_pRecordset->PutCollect("ziy",_variant_t(student.smajor));
m_pRecordset->Update();
上面这个代码里,录入姓名字段值为33333333333333333时,即超过10个字符时,它会把性别的值也加到后面,写到数据库里,这是什么原因呀?

解决方案 »

  1.   

    student.sname是什么类型的,长度是多少?
      

  2.   


    class STU
    {
    public:
    char snum[10];
    char sname[10];
    char ssex[2];
    long sage; char smajor[20];
    public:
    STU(){}
    ~STU(){}
    };int main()
    {
    STU student;
      

  3.   

    如果说sname录入太长的活,那也应该自动截取或者保存它自己的呀,为什么把性别的的内容也作为它的一部分保存了呢?
      

  4.   

    原因就是字符串是'\0'结尾的,如果找不到就一直向后找,所以就会有缓冲区溢出问题
    在你的这里
    sname[10]; 
    char ssex[2]; 
    在内存是挨着存放的
    sname超过十个后,就会把ssex覆盖掉,不信你写个12字符试试
    正好十个的话,他就接着读直到遇见字符'\0',而你ssex[0]表示性别,ssex[1]应该'\0'
      

  5.   

    struct分配了连续内存
    字符串是以'\0'唯一结束标识的
    所以会这样
      

  6.   


    sname超过十个后,ssex从第十一个开始,把sname覆盖,和sname正好十个的结果是一样的。不是把ssex覆盖掉