2010-02-07 5 views
2

Я прочитал xml-файл в char [] и пытаюсь сравнить каждый элемент в этом массиве с определенными символами, такими как «<» и «>». Шаблон массива «test» - это всего лишь массив одного элемента и содержит сравниваемый символ (мне пришлось сделать это так, или метод strcmp дал бы мне ошибку об преобразовании char в cons char *). Однако что-то не так, и я не могу понять это. Вот что я получаю:
< сравнивается с: значение < STRCMP: 44Сравнение символов в массиве символов с strcmp

Любая идея, что происходит?

char test[1]; 
for (int i=0; i<amountRead; ++i) 
{ 
    test[0] = str[i]; 
    if(strcmp(test, "<") == 0) 
     cout<<"They are equal"<<endl; 
    else 
    { 
     cout<<test[0]<< " is being compare to: "<<str[i]<<" strcmp value= "<<strcmp(test, "<") <<endl; 
    } 

} 
+1

Вы должны понимать ошибки, такие как 'char',' const char * 'и исправлять это с пониманием, а не взламывать его. Кроме того, показывая нам, что результат, который вы получаете, не является ошибкой для нас, мы понятия не имеем, что он на самом деле должен сказать. :) Наконец, это C++! Используйте 'std :: string' и упростите свою жизнь. – GManNickG

+4

Вы сравниваете один элемент за раз, вам не нужно сравнивать строки. сравните char вместо этого, ''<' == str [i]' – Anycorn

+0

Я бы использовал класс string, но я читаю xml-файл, который потенциально не может иметь пробелов (т.е. asdfsaf asdfsaf Так что я решил, было бы делать символ по характеру. В любом случае «'<' == str [i]" закончил работу (хотя я поклялся, что я уже пробовал это). Спасибо. – Isawpalmetto

ответ

1

Вам необходимо 0 завершить тестовую строку.

char test[2]; 
for (int i=0; i<amountRead; ++i) 
{ 
    test[0] = str[i]; 
    test[1] = '\0'; //you could do this before the loop instead. 
    ... 

Но если вы всегда намерены сравнить один символ за один раз, то буфер температуры не нужно вообще. Вы можете сделать это вместо того, чтобы

for (int i=0; i<amountRead; ++i) 
{ 
    if (str[i] == "<") 
     cout<<"They are equal"<<endl; 
    else 
    { 
     cout << str[i] << " is being compare to: <" << endl; 
    } 
} 
+1

Yuck, или вообще не использовать 'strcmp'.: P – GManNickG

+0

Согласен: 'if (str [i] == '<'' имеет больше смысла, чем текущий код, но strcmp имеет больше смысла, если план состоит в том, чтобы сравнить более крупные разделы позже. –

+0

Зачем копировать когда вы можете использовать strncmp? –

4

strcmp() ожидает и его параметры должны быть нулем строки, а не простые символы. Если вы хотите сравнить символы для равенства, вам не нужно вызывать функцию, просто сравните символы:

if (test[0] == '<') ... 
1

зЬгстр хочет обе строки, чтобы быть 0 прекращены.

Если у вас есть не-0 завершенные строки, используйте strncmp:

if(strncmp(test, "<", 1) == 0) 

Это до вас, чтобы убедиться, что обе строки по крайней мере N символов (где N является значение 3-го параметра). strncmp - это хорошая функция, которую вы можете использовать в своем умственном инструментарии.

+0

Спасибо, я держу это в виду. – Isawpalmetto