C++字符比较不起作用

问题描述:

这可能更好地说我做错了事,而不是说比较不起作用。但是,我现在已经查了一段代码了。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; 

    } 
} 

不工作的比较是代码[I] [0] == startNT。那么......我应该说,没有100%的时间工作。它直到递归函数的一半都很好,代码[i] [0]变成'S'并且startNT变成'T'(在证明它可以在通话期间的某个地方比较'S'和'T'之后),它仍然评估为true,这导致wkString.replace()因为找不到'T'而中断。

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

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)); 
+0

在大多数情况下,使用'std :: vector'而不是数组是一个好主意。 – bitmask 2012-02-23 04:59:58

+0

我只是用矢量来完成这件事,感谢您的帮助。但仅供将来参考,是否没有方法让类包含一个未知大小的数组,它将从传递的数组中复制大小? – Taylor 2012-02-23 05:21:30

+0

当你传递一个这样的数组时,它甚至不知道它的大小,所以不,你不能用它的大小做任何事情。这是不会在C++中使用原始数组的原因之一。改用vector或std :: array。如果原始数组的设计更好,Std :: array的行为方式就是这样。 – bames53 2012-02-23 06:44:10

您使用的,”我<代码 - >尺寸(); i ++'来控制循环,但代码是一个指向字符串的指针,所以我想它告诉你代码的第一个元素的大小,而不是代码字符串的数量。