为什么这段代码没有运行?

时间:2011-03-22 04:46:00

标签: c++ command-line

嘿,对不起,如果问了很多,但我不知道这里的问题是什么。

在下面的C ++代码中,我正在读取用户定义的输入文件并生成输出。我一直在一块一块地写它,把它放在一起,编译,测试等等,当我去解决bug时。这对我来说是一次学习经历,我猜第一个自我指导的课程......

无论如何,当我运行代码时,命令提示符打印一行并且没有响应。我会说它已经陷入了某种循环,但我相信这是不可能的。

我认为它可能与我试图声明的数组有关,我想创建一个动态字符串数组,但我发现这很难......

#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 个答案:

答案 0 :(得分:1)

我建议你注释掉一些代码,直到它开始以你期望的方式工作(通常这个有问题的位会变得很明显。)一旦你弄清楚什么是错的,你可以在StackOverflow上问一个更具体的问题。

答案 1 :(得分:0)

您应该使用调试器来调查程序行为。

为避免单步执行整个程序,可以设置希望传递序列的断点。如果未触发断点,则可以使用上一点的单步执行。此外,您可以查看变量内容。

答案 2 :(得分:0)

它永远找不到结束语:

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

请改为尝试:

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

你只需要转义“如果它包含在一个字符串文字中,例如”这个文字中有“这里有一个”“