一个程序,它将纠正在运算符

时间:2016-07-20 18:00:04

标签: c++

编写一个程序来纠正一个C ++程序,该程序在<<>>中使用的运算符cincout中存在错误。该程序取代了

的每个(不正确)发生

cin << 修正后的版本 cin >>

和每次(不正确)的发生 cout >> 修正后的版本 cout <<

允许cin<<之间以及cout>>之间可能存在任意数量的空白字符(一个或多个)。替换更正版本在cincout与以下运营商之间只有一个空白。

您的程序应该将源文件名作为用户的输入。修正后的版本应输出到名称为corrected.txt的文件中,并且还应显示在终端上。这意味着程序的输出(在获取文件名之后)应该与文件corrected.txt的内容完全相同。您的程序应该定义一个使用输入和输出文件流作为参数调用的函数。

代码没有编译错误。但是,代码输出没有(文件存在)。编译程序后,文件中的单词也会消失。谁能给我一些建议?谢谢!

#include <stdio.h>
#include <iostream>
#include <iomanip>
#include <cctype>
#include <fstream>
#include <string>
using namespace std;

void print(ifstream& input,ofstream& output, char next)
{

    input.get(next);
    cout << next;
    output.put(next);

    while(input >> next)
    {
        if(next=='c')
        {
            output.put(next);
            cout << next;
            input.get(next);

            if(next=='i')
            {   output.put(next);
                cout << next;
                input.get(next);


                if(next=='n')
                {
                    output.put(next);
                    cout << next;
                    while(next==' ')
                    {
                        input.get(next);
                    }
                    output.put(' ');
                    if(next=='<')
                    {

                        input.get(next);

                        if(next == '<')

                        {
                            cout << ">>";
                            input.get(next);

                        }
                        else
                        {
                            output.put(next);
                            cout << next;
                        }
                    }
                    else
                    {
                        output.put(next);
                        cout << next;
                    }
                }

                else
                {
                    output.put(next);
                    cout << next;
                }
            }

            else if (next=='o')
            {
                output.put(next);
                cout << next;
                input.get(next);

                if(next=='u')
                {
                    output.put(next);
                    cout << next;
                    input.get(next);


                    if(next=='t')
                    {
                        output.put(next);
                        cout << next;
                        while(next==' ')
                        {
                            input.get(next);
                        }
                        output.put(' ');
                        if(next=='>')
                        {

                            input.get(next);

                            if(next == '>')

                            {
                                cout << "<<";
                                input.get(next);

                            }
                            else
                            {
                                output.put(next);
                                cout << next;
                            }

                        }
                        else
                        {
                            output.put(next);
                            cout << next;
                        }

                    }
                    else
                    {
                        output.put(next);
                        cout << next;
                    }
                }

                else
                {
                    output.put(next);
                    cout << next;
                }
                input.get(next);
            }

        }

    }
}

int main()
{
    ifstream input;
    ofstream output;
    char next;
    char filename[16];
    cout << "Enter filename:" << endl;
    cin >> filename;
    input.open(filename);
    if(input.fail()) {
        cout << "Could not open the file " << endl;
        exit(0);
    }
    output.open("original.txt");

    if (output.fail()) {
        cout << "Could not open the file " << filename << endl;
        exit(1);
    }
    print(input, output, next);

    input.close();
    output.close();

    return 0;
}

1 个答案:

答案 0 :(得分:3)

我无法在评论中解释这一点。请不要太严厉地判断:

void print(ifstream& input,ofstream& output)
{
    bool first = true;
    std::string command;
    while(std::getline(input, command, ';'))
    { // loop until no more input to read or input fails to be read
        if (command.find("cin")!= std::string::npos)
        { // found cin somewhere in command. This is too crude to work. See below
            size_t pos = command.find("<<"); // look for the first <<
            while (pos != std::string::npos)
            { // keep replacing and looking until end of string
                command.replace(pos, 2, ">>"); // replace with >>
                pos = command.find("<<", pos); // look for another 
            }
        }
        else if (command.find("cout")!= std::string::npos)
        { // same as above, but other way around
            size_t pos = command.find(">>"); 
            while (pos != std::string::npos)
            {
                command.replace(pos, 2, "<<");
                pos = command.find(">>", pos);
            }
        }
        if (! first)
        {
            output << ';' << command; // write string to output
        }
        else
        {
            first = false;
            output << command; // write string to output
        }
    }
}

这将捕获并正确处理大多数情况。它无法处理的是:

一样
cout << Cincinnati; // find is just too dumb. Regex is not
           ^ finds a cin right here and starts reversing <<

评论

/* cout >> hah ha ha Sucker!!!; */

字符串文字

std::string fail = "cout >> Got you again!!!";

[expletive deleted]宏

#define evil cout >\
> "Gotcha!!!";

非常奇怪的事情,比如

cout << vector<vector<int>>(42)[0];
                         ^ Muhuhahahahahaha!!!

要做到这一点,你需要一个能够检测并消除上述故障情况的非平凡状态机。