-1

我正在编写 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};
4

4 回答 4

1

我看不出代码有什么问题,乍一看,我们希望看到您的“菜单”被打印出来。所以也许这里的诀窍是提出一些诊断想法。

首先,调试器。你说调试器没有显示错误?但它实际上去了哪几行?你能单步执行你的代码吗?你看到它进入 getOption() 了吗?你看到它进入你的循环了吗?看到它执行第一个 cout << 语句了吗?我的猜测不是,不是我能明白为什么。

其次添加一些打印语句。将您的主要更改为:

 int main(){
     cout << "hello" << endl;
     // GetOption();  <== removed
     cout << "goodbye" << endl;
 }

这里的想法是从肯定必须工作的东西开始。如果这不起作用,那是您的环境问题。您是否将输出重定向到某个地方?如果这确实有效,请取消注释 GetOption() 调用,现在会发生什么?希望你通过做这种事情得到一些线索。

确实,有时取出所有东西的技巧,从有效的东西开始(例如,hello world)并逐段添加代码,直到找到中断的地方。在这里,您所包含的内容可能是破坏性的(根据 Thomas 的建议)。

于 2013-04-28T18:37:23.330 回答
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);
}
于 2013-04-28T18:30:37.790 回答
0

由于您使用int函数的数据类型,GetOption()因此您必须返回一些内容,或者您​​可以将数据类型更改为 void。希望能帮助到你!

于 2013-04-28T19:25:12.987 回答
0

该代码实际上可以工作(在明显修复和删除对您未提供的代码的引用之后)并打印它应该打印的内容。
问题在于 cin 没有被检查是否有无效输入,因此如果您输入类似 'abc' 而不是数字例程之类的内容,将永远循环打印相同的提示。

于 2013-04-28T18:40:35.337 回答