回 帖 发 新 帖 刷新版面

主题:如何该近这个程序,到底哪里出了问题?

// Note:Your choice is C++ IDE
#include <iostream>
#include "string.h"
#include "iomanip"
#include "liu.cpp"// 自定义的
#define A <<setw(5) // 定义一个空格字符
typedef struct stud
{char name[10];// 没有开辟空间,导致了输入错误
    char sex[10];// 上面的我引发了错误,开始定义为int sex[10];不细心
  int year; 
  char born[20];
  union work  // 共用体
  { char worker[10];
      char leader[10];
  }st;
}Hong;

using namespace std;
int main()
{ // BEGIN   
    const int B=3;
    Hong WORK[B];
    int i;
    cout<<endl<<"请输入你的员工信息"<<endl;
    i=0;
     cout<<"***姓名****性别*****年龄*****生日*****领导或者工人********"<<endl;
    while(i<B)
   {  cout<<"INTER****";
     putchar(10);
     
         gets(WORK[i].name);  // cin与scanf都不能接受空格
         
        cin>>WORK[i].sex>>WORK[i].year>>WORK[i].born;
     
    if(WORK[i].year>40)
   { cout<<endl<<"请输入领导的职务"<<endl;
    gets(WORK[i].st.leader);
   }
    else
   {  cout<<endl<<"请输入员工的"<<endl;
    gets(WORK[i].st.worker);// 第二次运行时老是出现,就是用lu jdkf中间包括空格的时候,就会出现问题了
   }
    i++;
   }
   cout<<endl<<"*******员工与领导职务表*********"<<endl;
   for(i=0;i<B;i++)   
   { if(WORK[i].year>40)
    cout<<"领导的信息由"<<WORK[i].name  A<<WORK[i].sex  A<<WORK[i].year  A<<WORK[i].born  A<<WORK[i].st.leader  A<<endl;
    else
    cout<<"员工的信息由"<<WORK[i].name  A<<WORK[i].sex  A<<WORK[i].year  A<<WORK[i].born  A<<WORK[i].st.worker  A<<endl;
   }
  //  END
    return 0;
}
这个程序的主要存在的问题就是 ,我用scanf输入的时候,如输入liu ting名字的时候,第一个是正常的,但是,第二次开始,就是变得自己运行直到结束,就是说,我感觉老是有哪里在被自动复制了,程序直接跳到了结束,,,,,
请各位没法测试一下,,然后看看到底是哪里的错误导致的,,,麻烦了

回复列表 (共2个回复)

沙发

gets读入之后注意观察一下是否在输入流中留下了一个换行符

板凳


// Note:Your choice is C++ IDE
#include <iostream>
#include "string.h"
#include "iomanip"
#include "conio.h" 
#define A <<setw(5) // 定义一个空格字符
#define BE 1
typedef struct stud
{char name[20];// 没有开辟空间,导致了输入错误
    char sex[10];// 上面的我引发了错误,开始定义为int sex[10];不细心
  int year; 
  char born[20];
  union work  // 共用体
  { char worker[10];
      char leader[10];
  }st;
}Hong;

using namespace std;
int main()
{ // BEGIN   
    const int B=3;
    Hong WORK[B];
    int i;
    char ch;
    cout<<endl<<"请输入你的员工信息"<<endl;
    i=0;
     cout<<"***姓名****性别*****年龄*****生日*****领导或者工人********"<<endl;
    while(i<B)
   {  cout<<"INTER****";
        putchar(10);
   #if BE 
       { gets(WORK[i].name);  // cin与scanf都不能接受空格,用gets输入的原因是因为我想在、输入名字的时候有空格的情况,更现实一点
        getch();// 如果用getchar()那么下面输入的一个nan的第一个字母就会消失,变成了an,但是用getch()也会导致输入值是第一个词输入的一个字母
        // 表示不出来,所以我用ch=getchar()试试
        //ch=getchar();但是这个还是会吞噬一个字母,所以失败的,还是用getch()吧
        cin>>WORK[i].sex>>WORK[i].year>>WORK[i].born;
       }
   #else
   
     cin>>WORK[i].name>>WORK[i].sex>>WORK[i].year>>WORK[i].born;
   #endif
    if(WORK[i].year>40)
   { cout<<endl<<"请输入领导的职务"<<endl;
   #if BE
    getchar(); // 上面的回车影响了输入
    gets(WORK[i].st.leader);
   #else 
    cin>>WORK[i].st.leader;
   
   #endif
   }
    else
   {  cout<<endl<<"请输入员工的"<<endl;
  #if BE   
  getchar();// 吸收上面的回车
  cin>>WORK[i].st.worker;
  #else 
   gets(WORK[i].st.worker);// 第二次运行时老是出现,就是用lu jdkf中间包括空格的时候,就会出现问题了
  
   #endif
    }
//   memset(&WORK[i],0,sizeof(WORK[0]));  清零函数,全部清零
    i++;
   getchar();
   }
   cout<<endl<<"*******员工与领导职务表*********"<<endl;
   cout<<endl<<"**姓名***性别****年龄****生日*******职务***"<<endl;
   for(i=0;i<B;i++)   
   { if(WORK[i].year>40)
    cout<<"领导的信息由"<<WORK[i].name  A<<WORK[i].sex  A<<WORK[i].year  A<<WORK[i].born  A<<WORK[i].st.leader  A<<endl;
    else
    cout<<"员工的信息由"<<WORK[i].name  A<<WORK[i].sex  A<<WORK[i].year  A<<WORK[i].born  A<<WORK[i].st.worker  A<<endl;
   }
  //  END
    return 0;
 
}
// 这次的主要原因还是在输入的时候吧,有回车符留在了流中,所以要及时的去吸收了它,然后才是才能完成这个输入,所以
// 这个是一个教训,,至于怎样真正的输入一个而不用空一下,getch()的特殊决定,希望那个然帮助一下?

我来回复

您尚未登录,请登录后再回复。点此登录或注册