Почему этот код не запускается? - PullRequest
1 голос
/ 22 марта 2011

Эй, извините, если об этом много спрашивают, но я понятия не имею, в чем проблема.

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

В любом случае, когда я запускаю код, командная строка печатает ОДНУ строку и перестает отвечать на запросы. Я бы сказал, что это застряло в какой-то петле, но я считаю, что это невозможно.

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

#include <iostream>
#include <fstream>
#include <algorithm>
#include <cctype>
#include <string>
using namespace std;

int wordCount(string line)
{
    int fpos, fpos2; 
    int count = 0;
    fpos = line.find_first_not_of(' ');
    line.erase(0, fpos);

    while(line.size() > 0)
    {
        fpos = line.find_first_of(' ');
        if(line.at(0) == '"')
        {
            line.erase(0, 1);     
            for(int i = 0; i <line.size(); i++)
            if(line.at(i) == '"' && line.at(i-1) != '\\')
            {
                fpos2 = i;
                break;
            }
        line.erase(0, fpos2 + 2);
        }
            else
            line.erase(0, fpos + 1);
            count++;
    }


return count;
}

int main()
{
  //Current line; Input file; Output file;
string currentline, fileName, outFileName;

ifstream fin;
ofstream fout;

cout << "Enter input file name: ";
getline(cin, fileName);
cout << "Enter output file name: ";
getline(cin, outFileName);

fin.open(fileName.c_str());
if (!fin.good()) throw "I/O error";
fout.open(outFileName.c_str());
if (!fout.good()) throw "I/O error";
getline(fin, currentline);

while (!currentline.empty())
{

    int pos, pos1;


    pos = currentline.find("//");
    string postScript = currentline.substr(pos+2,-1);
    pos = currentline.find_first_of(';');
    string xline = currentline.substr(0,pos+1);
    cout << xline << endl;

    int size = wordCount(xline);
    string *words;
    words = (string *) malloc (size*sizeof(string));
    words = new string[size];
    pos = xline.find_first_not_of(' ');
    xline.erase(0, pos);        

    for ( int i = 0; i < size; i++ )
    {
        pos = xline.find_first_of(' ');
        if ( xline.at(0) == '"' )
        {
            xline.erase(0, 1);    
            for(int a = 0; a < xline.size(); a++) //This for loop finds the end of a quoted statement within the line.
                if ( xline.at(a) == '"' && xline.at(a-1) != '\\' )
                {
                    pos = a;
                    break;
                }
            words[i] = xline.substr(0,pos);
            xline.erase(0,pos + 2);
        }
        else
        {
            words[i] = xline.substr(0,pos);
            xline.erase(0,pos + 1);
        }
        cout << words[i] << endl;
    }
    cout << xline << endl << endl;

    getline(fin, currentline);
}

  return 0;
}

Ответы [ 3 ]

1 голос
/ 22 марта 2011

Я бы посоветовал вам комментировать биты кода, пока он не начнет работать так, как вы ожидаете (обычно проблемный бит становится очевидным при таком подходе.) Как только вы выясните, что не так, вы можете задать более конкретный вопрос о StackOverflow.

0 голосов
/ 22 марта 2011

Никогда не находит конечную цитату:

if ( xline.at(a) == '"' && xline.at(a-1) != '\\' )
{
  pos = a;
  break;
}

Попробуйте вместо этого:

if (xline.at(a) == '"')
{
  pos = a;
  break;
}

Вам нужно только экранировать ", если он содержится в строковом литерале, например," в этом литерале есть \ "*

0 голосов
/ 22 марта 2011

Вы должны использовать отладчик, чтобы исследовать поведение программы.

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

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