C++中cin问题!

为什么我在输入choose后无法继续操作了?


#include<iostream>
#include<string>
#define maxsize 50 
using namespace std;

class BaseString
{
    public:
        char* GetData();
        void Input();
        unsigned int GetLength(){return Length;}
        void Display();
        BaseString();
        ~BaseString();
        
    protected:
        char Data[maxsize];
        unsigned int Length;
};

BaseString::BaseString()
{
    Data[maxsize-1]='\0';
    Length=0;
    cout<<"Basestring finished"<<endl;
}

BaseString::~BaseString()
{
    Data[maxsize-1]='\0';
    Length=0;
    cout<<"~break basestring"<<endl;
}

char* BaseString::GetData()
{
    return Data;
}

void BaseString::Input()
{
    cout<<"请输入一个字符串:"<<endl;
    cin.getline(Data,50);
    for(Length=0;Data[Length]!='\0';Length++);  
}

void BaseString::Display()
{
    cout<<"该字符串为:"<<Data<<endl;
}

class ReString:virtual public BaseString
{
    public:
        void Inverse();
        void Display();
        void Input();
        ReString();
};
ReString::ReString()
{
    Data[maxsize-1]='\0';
    cout<<"ReString finished"<<endl;
}

void ReString::Input()
{
    cout<<"请输入一个字符串:"<<endl;
    cin.getline(Data,50);
    for(Length=0;Data[Length]!='\0';Length++);
}

void ReString::Display()
{
    cout<<Data<<endl;
}

void ReString::Inverse()
{
    for (int i=0;i<(Length-1)/2;i++)
    {
        char temp;
        temp=Data[i];
        Data[i]=Data[Length-i- 2];
        Data[Length-i-2]=temp;
    }
    Data[Length-1] ='\0';
}

//class CopyString:virtual protected BaseString
//{
//    public:
//        
//};
//
//class CmpSrring:private BaseString
//{
//    
//};

int main()
{
    int i,choose;
    for(i=1;i<=4;i++)
    {
        cout<<"*********************************************"<<endl;
        cout<<"*                 菜 单                     *"<<endl;
        cout<<"*    1:BaseString       2:ReString          *"<<endl; 
        cout<<"*    3:CopyString       4:CmpString         *"<<endl;
        cout<<"*********************************************"<<endl;
        cout<<"输入想要进行操作的序号:"<<endl;
        cin>>choose;
        
        if(choose==1)
        {
            BaseString basestring;
            basestring.Input();
            cout<<"字符串长度为:";
            cout<<basestring.GetLength()<<endl;
            basestring.Display();
        }
        if(choose==2)
        {
            ReString restring;
            restring.Input();
            restring.Inverse();
            cout<<"字符串长度为:";
            cout<<restring.GetLength()<<endl;
            restring.Display();
        }
        if(choose==3)
        {
            
        }
        if(choose==4)
        {
            
        }    
    }
}

1、cin在换行后才会执行;
2、cin在不会自动读取换行、空格等;
所以目前你的写法的正确用法应该如下:

输入想要进行操作的序号:
2hello
Basestring finished
ReString finished
请输入一个字符串:
字符串长度为:5
lleh
~break basestring

反转函数Data[Length-1] ='\0';这里的-1就不用了
首先目前就是少了一位,另外直接输入2\n会导致段溢出

你输入的是1还是2啊?

  • 以下回答由chatgpt基于相关博客总结生成:

    根据你提供的信息,问题可能出在如下两个方面:

    1. cin未重置导致程序一直停留在输入部分
    2. 输入格式错误导致程序无法进行下一步操作

    解决方案如下:

    1. 解决cin未重置问题

    在使用cin输入之前应该使用clear()函数重置一下cin标记位,接受新的输入,防止程序一直停留。

    示例代码:

    int choice;
    cout << "Please input your choice:" << endl;
    cin.clear(); // 清空cin标记位
    cin >> choice;
    
    1. 解决输入格式错误问题

    当输入格式错误时应该清除输入流,并提示用户重新输入正确的格式。使用clear()函数清除输入流,ignore()函数忽略输入流,从而达到清空输入流的目的。

    示例代码:

    int choice;
    cout << "Please input your choice:" << endl;
    while(!(cin >> choice)) { // 输入格式错误
        cin.clear(); // 清空cin标记位
        cin.ignore(numeric_limits<streamsize>::max(), '\n'); // 忽略输入流
        cout << "Please input again:" << endl;
    }
    

    这里使用while循环,重复提示用户重新输入,直到输入格式正确。

    另外,需要注意的是,使用cin输入字符串时,如果要保留空格,需要使用getline()函数,而不是cin。

    示例代码:

    string str;
    cout << "Please input a string with space:" << endl;
    getline(cin, str); // 保留空格
    cout << "The input string is: " << str << endl;
    

    以上是两种可能存在问题的情况及对应的解决方案。如果还有其他问题,可以提供更具体的信息,以便更好地解决问题。