为什么键盘输入字符串和文件导入字符串都有错?错误应该怎么改?
#include <iostream.h>
#include <windows.h>
#include <string>
#include<fstream>

using namespace std;

class Stack;//类Stack的声明

/*
定义一个链栈结点类Stacknode
*/
class Stacknode
{
    friend class Stack;//申请友元类
private:
    Stacknode(Stacknode *nextp=NULL);//构造函数
    Stacknode(char &newdata,Stacknode *nextp=NULL);//构造函数
    int data;//数据元素
    Stacknode *next;//递归定义指向后继结点的指针
};

/*
Stacknode的实现部分
*/
Stacknode::Stacknode(Stacknode *nextp)//构造函数
{
    next=nextp;
}

Stacknode::Stacknode(char &newdata,Stacknode *nextp)//构造函数
{
    data=newdata;
    next=nextp;
}
//结点类Stacknode的定义结束

/*
定义一个链栈类Stack
*/
class Stack
{
public:
    Stack();//创建一个空栈
    ~Stack();//回收一个栈
    void clear();//销毁一个栈
    bool empty() const;//确定栈是否已空
    bool push(char &item);//把数据压进栈
    bool pop();//出栈
    bool pop(char &item);//把数据弹出栈,返回
    bool top(char &item) const;//取出栈顶元素
private:
    Stacknode *newnode(Stacknode *nextp=NULL);
    Stacknode *newnode(char &item,Stacknode *nextp=NULL);//创建新的结点
    Stacknode *Stacktop;
    int Stacklength;
};

/*
Stack的实现部分
*/
Stacknode *Stack::newnode(Stacknode *nextp)//创建新的结点,不带数据
{
    return new Stacknode(nextp);
}

Stacknode *Stack::newnode(char &item,Stacknode *nextp)//创建新的结点,数据域赋值
{
    return new Stacknode(item,nextp);
}

//以下为栈类Stack的函数定义
Stack::Stack()//创建一个空栈
{
    Stacktop=newnode();//创建一个栈顶指针初始化,相当于Stacktop=NULL;本链表没有用头结点
    Stacklength=0;
}

Stack::~Stack()//回收一个栈
{
    clear();
    delete Stacktop;//释放栈底
}

void Stack::clear()//销毁一个栈
{
    while(pop());//不停地出栈,而每次释放空间在出栈函数中完成
}

bool Stack::empty() const//确定栈是否已空
{
    return Stacklength<=0?true:false;
}

bool Stack::push(char &item)//数据进栈
{
    Stacknode *newnodep;//定义指针newnodep,准备指向申请的新结点
    newnodep=newnode(item,Stacktop);//申请新结点,把数据存入,把指针域指向头指针
    if(!newnodep)//如果没有申请到空间,返回失败
        return false;
    Stacktop=newnodep;//改链,完成进栈
    Stacklength++;//栈的长度增加
    return true;//本次操作成功
}

bool Stack::pop()//出栈,不要栈顶数据
{
    Stacknode *usednodep;//定义指针usednodep,准备指向出栈的结点
    if(!empty())//判断是否栈空
    {
        usednodep=Stacktop;//指向出栈的结点
        Stacktop=Stacktop->next;//栈顶指针后移
        delete usednodep;//释放空间
        Stacklength--;//栈的长度减少
        return true;//本次操作成功
    }
    return false;//否则本次操作失败
}

bool Stack::pop(char &item)//出栈,把栈顶数据弹返回去
{
    Stacknode *usednodep;//定义指针usednodep,准备指向出栈的结点
    if(!empty())//判断是否栈空
    {
        usednodep=Stacktop;//指向出栈的结点
        Stacktop=Stacktop->next;//栈顶指针后移
        item=usednodep->data;//把数据保留下来,返回去
        delete usednodep;//释放空间
        Stacklength--;//栈的长度减少
        return true;//本次操作成功
    }
    return false;//否则本次操作失败
}

bool Stack::top(char &item) const//取出栈顶数据返回去
{
    if(!empty())//如果栈不空,记录当前栈顶元素
    {
        item=Stacktop->data;//通过item返回去
        return true;//本次操作成功
    }
    return false;//否则本次操作失败
}

/*
定义一个功能类SymbolMatching
*/
class SymbolMatching
{
private:
    Stack *stack;
public:
    SymbolMatching();//构造函数
    ~SymbolMatching();//析构函数
    bool manualinputdatabase(char *database);//人工输入数据信息
    bool fileguidedatabase(char *filename);//文件导入数据信息
};

SymbolMatching::SymbolMatching()//构造函数
{
    stack=new Stack;
}

SymbolMatching::~SymbolMatching()//析构函数
{
    delete stack;
}

bool SymbolMatching::manualinputdatabase(char *database)//人工输入数据信息
{
    int i=0;
    char match,symbol;
    bool is_match=true;
    while(database[i]!='\0'&&is_match)
    {
        symbol=database[i++];
        if(symbol=='('||symbol=='{'||symbol=='[')
            stack->push(symbol);//入栈
        else if(symbol==')'||symbol=='}'||symbol==']')
        {
            if(stack->empty())
            {
                if(database[i+1]!='\0')
                    cout<<"右边符号多于左边符号!"<<endl;
                else
                    cout<<"符号"<<symbol<<"无法找到与之匹配的符号!"<<endl;
                is_match=false;
            }
            else
            {
                stack->top(match);
                stack->pop();//出栈
                is_match=(symbol==')'&&match=='('||symbol==']'&&match=='['||symbol=='}'&&match=='{');
                if(!is_match)
                    cout<<"符号"<<match<<"和"<<symbol<<"不匹配!"<<endl;
            }
        }
    }
    if(is_match)
    {
        if(!stack->empty())//栈不为空
        {
            cout<<"左边符号多于右边符号!"<<endl;
            is_match=false;
        }
        else
            cout<<"左右符号匹配次序正确!"<<endl;
    }
    stack->clear();
    return is_match;
}

bool SymbolMatching::fileguidedatabase(char *filename)//文件导入数据信息
{
    int i=0;
    char match,symbol;
    bool is_match=true;
    while(filename[i]!='\0'&&is_match)
    {
        symbol=filename[i++];
        if(symbol=='('||symbol=='{'||symbol=='[')
            stack->push(symbol);//入栈
        else if(symbol==')'||symbol=='}'||symbol==']')
        {
            if(stack->empty())
            {
                if(filename[i+1]!='\0')
                    cout<<"右边符号多于左边符号!"<<endl;
                else
                    cout<<"符号"<<symbol<<"无法找到与之匹配的符号!"<<endl;
                is_match=false;
            }
            else
            {
                stack->top(match);
                stack->pop();//出栈
                is_match=(symbol==')'&&match=='('||symbol==']'&&match=='['||symbol=='}'&&match=='{');
                if(!is_match)
                    cout<<"符号"<<match<<"和"<<symbol<<"不匹配!"<<endl;
            }
        }
    }
    if(is_match)
    {
        if(!stack->empty())//栈不为空
        {
            cout<<"左边符号多于右边符号!"<<endl;
            is_match=false;
        }
        else
            cout<<"左右符号匹配次序正确!"<<endl;
    }
    stack->clear();
    return is_match;
}

/*
定义一个实现链栈功能的菜单处理类interfacebase
*/
class interfacebase
{
private:
    SymbolMatching SymbolMatchingonface;
public:
    void clearscreen(void);//清屏
    void showmenu(void);//显示菜单函数
    int userchoice(void);//用户的选项
    void processmenu(int menuchoice);//菜单函数
};

/*
interfacebase类的实现部分
*/
void interfacebase::clearscreen(void)
{
    system("cls");
}

void interfacebase::showmenu(void)
{
    cout<<"链式堆栈实现括号匹配判断的功能菜单"<<endl;
    cout<<"=================================="<<endl;
    cout<<"1.人工输入数据信息"<<endl;
    cout<<"2.文件导入数据信息"<<endl;
    cout<<"0.退出"<<endl;
    cout<<"=================================="<<endl;
}

int interfacebase::userchoice(void)
{
    int menuchoice;
    cout<<"请输入您的选择:";
    cin>>menuchoice;
    return menuchoice;
}

void interfacebase::processmenu(int menuchoice)
{
    switch(menuchoice)//根据用户的选择进行相应的操作
    {
    case 1:
        {
            string str;
            char temp;
            cout<<"输入字符串,按回车键结束输入:"<<endl;
            while((temp=cin.get())!='\n')
            {
                str +=temp;
            }
            const int LEN =str.length();
            char* database = new char[LEN];//根据输入字符串的长度,创建字符数组
            for(int i = 0;i<LEN;i++) //将字符串保存到字符数组中
            {
                database[i]=str[i];
            }
            SymbolMatchingonface.manualinputdatabase(database);
            delete database;
        }
        break;
    case 2:
        {
            ifstream in("data.txt");
            char data,j,*filename=new char[100];
            int num=0;
            while(!in.eof())
            {
                in>>data;
                filename[num]=data;
                cout<<filename[num];
                num++;
            }
            cout<<endl;
            SymbolMatchingonface.fileguidedatabase(filename);
            delete filename;
        }
        break;
    case 0:
        exit(0);
    default:
        cout<<"对不起,您输入的功能编号有错!请重新输入!!!"<<endl;
        break;
    }
}

/*
程序主入口
*/
void main(void)
{
    int menuchoice;//定义变量,菜单选单项的选择
    interfacebase interfacebasenow;
    system("color f0");//修改屏幕的背景色和字的颜色
    interfacebasenow.clearscreen();//清屏
    while(1)//永真循环
    {
        interfacebasenow.showmenu();//显示菜单
        menuchoice=interfacebasenow.userchoice();//获取用户的选择
        interfacebasenow.processmenu(menuchoice);//处理用户的选择
        system("pause");
        interfacebasenow.clearscreen();//清屏
    }
}//主函数结束

c++

1个回答

第一个

While(1) {
 char tmp = cin.get();
 if (tmp == '\r' /*Aka '\n'*/) {
     break;
    }
    else {
        str += tmp;
    }
}

第二个
如果你要获取整个TXT内的所有内容,可以这样:

string str, tmp;
while (getline(in, tmp) {
    str += tmp;
}

如果不行的话再问吧,我也不太搞控制台这边,但希望采纳一下,谢谢!

weixin_42375906
Rotch 回复追忆~似水年华: 你等一下,我改一下我的回答,,这样回复效果不好
4 个月之前 回复
weixin_42375906
Rotch 回复追忆~似水年华: 第一个输入直接 cin >> 不就可以吗,或者你试试把 \n 改成 \r,再或者 while(1) {
4 个月之前 回复
qq_42660156
追忆~似水年华 case 1: { string str; char temp; cout<<"输入字符串,按回车键结束输入:"<<endl; while((temp=cin.get())!='\n') { str +=temp; } const int LEN =str.length(); char* database = new char[LEN];//根据输入字符串的长度,创建字符数组 for(int i = 0;i<LEN;i++) //将字符串保存到字符数组中 { database[i]=str[i]; } SymbolMatchingonface.manualinputdatabase(database); delete database; } break; case 2: { ifstream in("data.txt"); char data,j,*filename=new char[100]; int num=0; while(!in.eof()) { in>>data; filename[num]=data; cout<<filename[num]; num++; } cout<<endl; SymbolMatchingonface.fileguidedatabase(filename); delete filename; } break;
4 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!

相似问题

1
利用指针写一函数,实现一长字符串中两短字符串交换,从主函数输入待替换的长字符串以及替换前后两个子串?
1
C语言求助:输入一个字符串,将其中的字母字符输入一个链表,将其中的数字字符输入另一个链表。
3
获取input标签输入字符串中字母和数字的个数
4
键盘输入一个字符串,统计并输出字母个数。
0
输入字符串a,用指针,将其中数字,字母分别剔除并按原来顺序字符串b和c里,最后分别输出a,b,c三个字符串
1
(C语言)输入一个有20个以上字符的字符串,分别统计字符串中字符a和s(只限于小写)的个数,并输出结果。
0
mongodb截取数据库一段字符串并判断是否包含别的字符串怎么写
1
用C语言如何解决:对于输入的每个字符串,查找其中的最大字母,在该字母后面插入字符串
0
输入一行字符(长度不确定),先把输入的字符串写到文本文件,然后从该文件中读出来?
1
如何在键盘输入某个字符串的名字然后再输出?
1
输入一个字符串,可以删除字符串s中的任意字符,剩下的字符串形成对称字符串,且该字符串为最长对称字符串
2
指定位置输出字符串:输入一个字符串后再输入两个字符,输出此字符串中从与第一个字
4
字符串是A,B 后台要把字符串写到sql里,所以字符串要转为'A','B' 查询用的JdbcTemplate
3
JS十六进制字符串转字符串问题
1
输入带空格的string类型的字符串
0
判断这个字符串是否是安全的,如何采用C语言的程序的设计的代码的形式来实现对于字符串安全的判断
0
c语言如何读取文本文件中指定的字符串并保存到字符串数组中?
1
求大佬指教:为什么npm run build打包后,js代码中的字符串没有被混淆加密?有没有什么解决办法?
3
Php 中单引号字符串和双引号字符串的区别是什么?
7
如何在 Java 中分割字符串?