C ++ Память / Проблема с вводом - PullRequest
0 голосов
/ 27 сентября 2011

Я пытаюсь создать небольшую программу на c ++, где пользователь вставляет несколько строк, и программа выводит все строки после , дается команда EOT (ctrl-d)

Но я получаю некоторые ошибки при выполнении программы. Я думаю, что я сделал много неправильно.

(Это гипотетическое упражнение, я не хочу использовать какие-либо векторы, списки и т. Д., А хочу только включить iostream.

#include <iostream>

using namespace std;

int main()
{
//Temp input string
string input_string;

//Array with input lines
string lines[1];    

//Counter for input lines
size_t line_counter = 0;

//Input terminated checker
bool breaker = false;

//Eternal loop
for(;;){

    //Get line, store in input_string and set breaker if input is terminated
    if(getline(cin, input_string).eof()) breaker = true;

    //Create a new temp array to hold our data
    string temp_lines[line_counter+1];
    for(size_t counter = 0; counter != line_counter; ++counter){
        //And use a for loop to get data from our last array with data
        temp_lines[counter] = lines[counter];
    }

    //Create a second array and repeat process
    //because c++ doesn't allow us to create dynamic array's 
    string lines[line_counter+1];
    for(size_t counter = 0; counter != line_counter; ++counter){
        lines[counter] = temp_lines[counter];
    }

    //store input in the new array
    lines[line_counter] = input_string;            

    //increase the input counter
    ++line_counter;

    //if breaker is set terminate loop but output lines first
    if(breaker){

        //for each input
        for(size_t anothercounter = 0; anothercounter != line_counter; ++anothercounter){

            //output the inputed line
            cout << anothercounter << ": " << lines[anothercounter] << "\n";

        }

        //break out of eternal for loop
        break;   
    }

}

}

Ответы [ 2 ]

0 голосов
/ 27 сентября 2011

Попробуйте что-то вроде этого (не проверено, отредактировано в блокноте):

#include <iostream>

using namespace std;

int main()
{
    //Temp input string
    string input_string;
    //Array with input lines
    string * lines = 0;    
    // Array used for temporary storage
    string * temp_lines = 0;
    //Counter for input lines
    size_t line_counter = 0;
    //Input terminated checker
    bool breaker = false;
    //Eternal loop
    for(;;){
        //Get line, store in input_string and set breaker if input is terminated
        if(getline(cin, input_string).eof()) breaker = true;
        // Copy all lines from original array to temporary array, to enable resizing the original
        temp_lines = new string[line_counter+1];
        for(size_t tmp = 0; tmp < line_counter; tmp++) temp_lines[tmp] = lines[tmp];
        temp_lines[line_counter] = input_string;
        delete [] lines;
        lines = new string[line_counter+1];
        for(size_t tmp = 0; tmp <= line_counter; tmp++) lines[tmp] = temp_lines[tmp];
        delete [] temp_lines;
        //increase the input counter
        ++line_counter;
        //if breaker is set terminate loop
        if(breaker) break;
    }
    //for each input
    for(size_t anothercounter = 0; anothercounter != line_counter; ++anothercounter){
        //output the inputed line
        cout << anothercounter << ": " << lines[anothercounter] << "\n";
    } 
}
0 голосов
/ 27 сентября 2011

С одной стороны, я могу ошибаться: вы не можете сделать это

//Create a new temp array to hold our data
string temp_lines[line_counter+1];

, поскольку line_counter - переменная, а размер массива должен быть постоянной времени компиляции.В противном случае используйте new для выделения памяти для массива.

Также очень помогло бы ответить на ваш вопрос, если вы также опубликуете ошибки, которые вы получаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...