2012-02-23 3 views
0

Возможно, лучше сказать, что я делаю что-то неправильно, а потом говорю, что сравнение не работает. Но я уже давно перебираю этот код.C++ char сравнение не работает

У меня есть рекурсивная функция. Большинство из них работает хорошо, так что я буду только положить ту часть, которая не работает:

//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; 

    } 
} 

Сравнение, что не работает это код [я] [0] == startNT. Ну ... я должен сказать, не работает в 100% случаев. Он отлично работает до половины пути через рекурсивную функцию, код [i] [0] становится «S», а startNT становится «T» (после того, как он уже доказывает, что он может правильно сравнивать «S» и «T» где-то во время разговора) и он по-прежнему оценивает значение true, что вызывает разрыв wkString.replace(), поскольку он не может найти «T».

Прошло некоторое время с тех пор, как я использовал C++, поэтому я, вероятно, делаю глупую ошибку. Спасибо за любую помощь.

ответ

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

Использование 'std :: vector' вместо массива является хорошей идеей в большинстве случаев. – bitmask

+0

Я просто использую векторы, чтобы это сделать, спасибо за помощь. Но только для справки в будущем, нет ли способа, чтобы класс содержал массив неизвестного размера, который скопирует размер из переданного массива? – Taylor

+0

Когда вы передаете такой массив, он даже не знает его размера, поэтому нет, вы не можете использовать его размер ни для чего. Это одна из причин, по которой никогда не использовать необработанные массивы в C++. Вместо этого используйте вектор или std :: array. Std :: array ведет себя так, как если бы они были лучше разработаны. – bames53

1

Вы используете,»я < код-> размер(); i ++ ', чтобы управлять циклом, но код является указателем на строку, поэтому я думаю, что он говорит вам размер первого элемента кода, а не количество строк кода.

Смежные вопросы