C ++ программа не печатает? - PullRequest
0 голосов
/ 10 ноября 2018

Я работал над программой на C ++, чтобы вносить морфологические изменения в текстовый файл, который выбирает пользователь, но во время создания этой программы я столкнулся с проблемой, когда другая функция, по сути, выполняет свою функцию так же, как другие функции, не будут печатать. Хотя это должно быть печать.

Вот что у меня есть:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <sstream>
#include <algorithm>
//look up line by line parsing
using namespace std;
void replacee(vector<vector<char>> &vec, char oldd, char neww)
{
    for (vector<char> &v : vec) // reference to innver vector
    {
        replace(v.begin(), v.end(), oldd, neww); // standard library 
algorithm
    }
}
void dialationn(vector<vector<char>> &vec, char suspect, char n)
{
    for (int i = 0; i < vec.size(); i ++) {
            for (int j = 0; j < vec[i].size(); j++) {
                if (vec[i][j] == suspect) {
                    if (i > 0) {
                     vec[i-1][j] = n;
                    }
                    if (j > 0) {
                     vec[i][j-1] = n;
                    }
                    if (i + 1<vec.size()) {
                        vec[i+1][j] = n;
                    }
                    if (j + 1<vec[i].size()) {
                        vec[i][j+1] = n;
                    }
                }
            }
        }
        replacee(vec, n, suspect);
}    
int main(int argc, char* argv[]) {

    fstream fin; char ch;
    string name (argv[1]); //File Name.
    vector<vector<char>> data;
    // 2D Vector.
    vector<char> temp;
    // Temporary vector to be pushed 
    // into vec, since its a vector of vectors.
    fin.open(name.c_str(),ios::in);
    // Assume name as an arbitary file.
    string argument2 (argv[2]);
    string argument3 (argv[3]);
    string argument4 (argv[4]);
    while(fin)
    {
        ch = fin.get();
        if(ch!='\n') {
            temp.push_back(ch);
        }
        else 
        { 
            data.push_back(temp); 
            temp.clear(); 
        }
    }
    if (argument2 == "replace") {
        replacee(data, argument3[0], argument4[0]);
        for (int i = 0; i < data.size(); i ++) {
            for (int j = 0; j < data[i].size(); j++) {
                cout << data[i][j];
            }
            cout << endl;
        }
    } else if (argument2 == "dilate") {
        dialationn(data, argument3[0], 'i');
        for (int m = 0; m < data.size(); m ++) {
            for (int n = 0; n < data[m].size(); n++) {
                cout << data[m][n];
            }
            cout << endl;
        }
    }

    fin.close();
} 

Примечание: причина, по которой я так растерялся, заключается в том, что метод печати, который я использовал в int main, работает для замены, но не работает для расширения. Я не вижу каких-либо серьезных различий между этими двумя функциями, чтобы они не печатали. Я даже сделал небольшую тестовую программу, и она работала в этом:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <sstream>
#include <algorithm>

using namespace std;
void replacee(vector<vector<char>> &vec, char oldd, char neww)
{
    for (vector<char> &v : vec) 
    {
        replace(v.begin(), v.end(), oldd, neww); 
    }
}

void dialationn(vector<vector<char>> & vec, char suspect, char n)
{
    for (int i = 0; i < vec.size(); i ++) {
            for (int j = 0; j < vec[i].size(); j++) {
                if (vec[i][j] == suspect) {
                    if (i > 0) {
                     vec[i-1][j] = n;
                    }
                    if (j > 0) {
                     vec[i][j-1] = n;
                    }
                    if (i + 1<vec.size()) {
                        vec[i+1][j] = n;
                    }
                    if (j + 1<vec[i].size()) {
                        vec[i][j+1] = n;
                    }
                }
            }
        }
        replacee(vec, n, suspect);
}
int main(int argc, char* argv[]) 
{
    vector<vector<char>> data(5, std::vector<char>(9,'.'));
    data[2][4] = 'x';
    dialationn(data, 'x', 'i');
    for (int i = 0; i < data.size(); i ++) {
            for (int j = 0; j < data[i].size(); j++) {
                cout << data[i][j];
            }
            cout << endl;
        }
} 

Поскольку это выполняется с помощью входных данных из командной строки, они выполняются следующим образом для функции замены:

./a.exe input1.txt replace (OLD LETTER NEEDING TO BE REPLACED) (NEW LETTER REPLACING)

Для функции расширения:

./a.exe input1.txt dilate (SYMBOL IN FILE TO DILATE)

input1.txt выглядит следующим образом:

.........
.........
.........
.........
....X....
.........
.........
.........
.........

1 Ответ

0 голосов
/ 10 ноября 2018

При вводе input1.txt dialate X программа вызывает неопределенное поведение при запросе пятого параметра с

string argument4 (argv[4]);

Решение:

argument4 используется только в теле if (argument2 == "replace") поэтому вам следует перенести определение и инициализацию argument4 в тело if.

. Я также настоятельно рекомендую проверить argc заранее, чтобы убедиться, что у вас достаточно аргументов.argc - количество предоставленных пользователем аргументов плюс 1 для команды, используемой для запуска программы 1 .Не рассчитывайте на то, что пользователь не сделает ошибок.Мешки с мясом, как известно, весьма подвержены ошибкам.

Ваша программа должна убедиться, что argc минимум 3, прежде чем получить argument1, а argument2 и argument2 сообщат вам, если вам нужноargc из 4 или 5 для продолжения.

1 Обычно.argv[0] может быть оставлено пустым, поскольку некоторые системы, обычно встроенные, не имеют названия программы

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