C ++ char比较不起作用

时间:2012-02-23 04:34:20

标签: c++

最好说我做错了,而不是说比较不起作用。但是,我已经讨论了这段代码了一段时间。

我有一个递归函数。大多数都运作良好,所以我只会把那部分不起作用的部分:

//In main
string C[] = {"S=>bS",
                    "S=>aaT",
                    "T=>aT",
                    "T=>bU",
                    "U=>Ua",
                    "U=>aa"};
CFG CFG1(C);

...

string *code;
char startNT;
//The CFG constructor 
CFG::CFG(string C[])
{
    code = C;
    startNT = code[0][0];
}

...

//Inside of processData recursive function
for(unsigned int i = 0; i < code->size(); i++)
{
    if(code[i][0] == startNT)
    {
        string newStr = code[i].substr(code[i].find(">")+1);
        string old = wkString;
        //This is the recursive call
        if(processData(inString, wkString.replace(wkString.find_first_of(startNT), wkString.find_first_of(startNT)+1, newStr)))
        {
            return true;
        }
        cout << wkString << endl;
        wkString = old;

    }
}

无效的比较是code [i] [0] == startNT。嗯......我应该说,100%的时间不工作。它直到递归函数的一半才能工作,代码[i] [0]变为'S'并且startNT变为'T'(在已经证明它可以在调用期间在某处正确地比较'S'和'T'),并且它仍然计算为true,这会导致wkString.replace()中断,因为它找不到'T'。

我使用C ++已经有一段时间了,所以我可能犯了一个愚蠢的错误。谢谢你的帮助。

2 个答案:

答案 0 :(得分:3)

code是指向字符串数组中第一个字符串的指针。所以当你说code->size()时,这就是第一个字符串的大小(字符数)(你给出的例子中为5)。我很确定你试图迭代字符串数组,而不是第一个字符串中的字符。这是错的。

不幸的是,由于您将指针存储在类中而不是数组中,因此类的大小是未知的。所以你不能正确地迭代它。你需要以某种方式重构你的代码。没有能够更充分地看到它,我无法提出任何具体的建议。

您可能想要做的是在实际的类中存储字符串集合。默认情况下,我建议使用矢量。您的代码可能看起来像这样:

// in class CFG
std::vector<std::string> code;
char startNT;

CFG(const string * C, int N)
    :code(C, C+N),
    startNT(code[0][0]) // strong assumption made here
{}
...
// processData
for(unsigned int i = 0; i < code.size(); i++) // note, dot instead of arrow
{
...
// in main
std::string C[] = {
    "S=>bS",
    "S=>aaT",
    "T=>aT",
    "T=>bU",
    "U=>Ua",
    "U=>aa"
};

CFG CFG1(C, sizeof(C)/sizeof(*C));

答案 1 :(得分:1)

您正在使用,'i&lt;代码 - &GT;大小(); i ++',控制循环,但代码是指向字符串的指针,因此我认为它告诉你代码的第一个元素的大小,而不是代码字符串的数量。