我正在写一个c ++代码
在这段代码中,我首先调用函数GetOption(),但它看起来没什么
任何人都可以帮助我吗?
其他功能有其他用途,但我不确定它是否会影响它。因此我将它全部粘贴!
以下是我的代码:
#include<iostream>
#include<iomanip>
#include<fstream>
#include<boost/regex.hpp>
#include"ContactRec.h"
using namespace std;
using namespace boost;
int GetOption();
int main(){GetOption();}
ContactRec GetContactInfo()
{
ContactRec id;
ofstream myoutfile("directory.txt",ios::app);
regex reg_email("^\\w+([\\.-]?\\w+)*@\\w+([\\.-]?\\w+)*(\\.\\w{2,3})+$");
regex reg_tel("^\\(?(\\d{3})\\)?-?(\\d{3})-(\\d{4})$");
cout<<"enter your name."<<endl;
cin.ignore(1024,'\n');
getline(cin,id.Name);
cout<<"enter your email."<<endl;
cin>>id.Email;
while (regex_match(id.Email,reg_email)==0)
{
cout<<"data wrong!!!!!!"<<endl;
cin>>id.Email;
}
cout<<"enter your telephone numbers. EX:012-111-1111"<<endl;
cin>>id.Phone;
while(regex_match(id.Phone,reg_tel)==0)
{
cout<<"data wrong!"<<endl;
cin>>id.Phone;
}
cout<<"Please enter the type(0)Family,(1)Friend,(2)Other"<<endl;
int p;
cin>>p;
id.Type=(ContactType)p;
myoutfile<<setiosflags(ios::left)<<setw(30)<<id.Name;
myoutfile<<setiosflags(ios::left)<<setw(30)<<id.Email;
myoutfile<<setiosflags(ios::left)<<setw(30)<<id.Phone;
myoutfile<<setiosflags(ios::left)<<setw(30)<<id.Type<<endl;
myoutfile.close();
return id;
}
void PrintContactInfo(int type)
{
ContactRec person;
ifstream myinfile;
myinfile.open("directory.txt",ios::in);
cout<<setiosflags(ios::left)<<setw(30)<<"name";
cout<<setiosflags(ios::left)<<setw(30)<<"email";
cout<<setiosflags(ios::left)<<setw(30)<<"telephone";
cout<<setiosflags(ios::left)<<setw(30)<<"type"<<endl;
string temp;
if (type==-1)
{
while (myinfile)
{
getline(myinfile,temp);
cout<<temp<<endl;
}
}
else if(type==0)
{
while (myinfile)
{
getline(myinfile,temp);
if (temp[70]=='0')
cout<<temp<<endl;
}
}
else if(type==1)
{
while (myinfile)
{
getline(myinfile,temp);
if (temp[70]=='1')
cout<<temp<<endl;
}
}
myinfile.close();
}
int GetOption()
{
int number=0;
while(number!=5)
{
cout<<"(1)Add a new record"<<endl;
cout<<"(2)Display the all contacts."<<endl;
cout<<"(3)Display the contacts of family. "<<endl;
cout<<"(4)Display the contacts of friends."<<endl;
cout<<"(5)Exit."<<endl;
cin>>number;
if (number==1)
GetContactInfo();
if (number==2)
PrintContactInfo(-1);
if (number==3)
PrintContactInfo(0);
if (number==4)
PrintContactInfo(1);
}
}
以下是ContactRec.h
#include <string>
#include"ContactType.h"
using namespace std;
struct ContactRec
{
string Name;
string Phone;
string Email;
ContactType Type;
};
ostream& operator<<(ostream& out,const ContactRec id)
{
out<<id.Name;
out<<id.Email;
out<<id.Phone;
out<<id.Type;
}
以下是ContactType.h
enum ContactType{Family,Friend,Other};
答案 0 :(得分:1)
我看不出代码有什么问题,乍一看我们希望看到你的“菜单”被打印出来。所以这里的诀窍可能是提出一些诊断性的想法。
首先,调试器。你说调试器没有显示错误?但它实际上去了哪些线?你可以单步执行代码吗?你看到它进入getOption()吗?你看到它进入你的循环吗?看它执行第一个cout&lt;&lt;声明?我的猜测不是,不是我能看出原因。
第二次添加一些打印语句。将您的主要内容更改为:
int main(){
cout << "hello" << endl;
// GetOption(); <== removed
cout << "goodbye" << endl;
}
这里的想法是从一定必须起作用的东西开始。如果这不起作用,则问题就在于您的环境。你是否将输出重定向到某个地方?如果确实有效,请取消注释GetOption()调用,现在会发生什么?希望你能通过做这样的事情获得一些线索。
确实有时候把所有东西都取出来的伎俩,从有用的东西开始(例如你好世界)并逐个添加你的代码,直到找到什么破坏。在这里,或许你所包含的东西是破坏事物(根据托马斯的建议)。
答案 1 :(得分:0)
试试这个
void GetOption()
{
int number;
do
{
cout<<"(1)Add a new record"<<endl;
cout<<"(2)Display the all contacts."<<endl;
cout<<"(3)Display the contacts of family. "<<endl;
cout<<"(4)Display the contacts of friends."<<endl;
cout<<"(5)Exit."<<endl;
cin>>number;
if (number==1)
GetContactInfo();
if (number==2)
PrintContactInfo(-1);
if (number==3)
PrintContactInfo(0);
if (number==4)
PrintContactInfo(1);
}while(number!=5);
}
答案 2 :(得分:0)
此代码实际上是work(在明显修复并删除了您未提供的代码的引用之后)并打印了它应该打印的内容。
问题是cin没有被检查无效输入,因此如果您输入类似'abc'而不是数字例程将循环永远打印相同的提示。
答案 3 :(得分:0)
由于您使用int
作为函数GetOption()
的数据类型,因此必须返回某些内容,或者您可以将数据类型更改为无效。希望它有所帮助!