Сравнение символов в массиве символов с помощью strcmp - PullRequest
2 голосов
/ 07 февраля 2010

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

Есть идеи, что происходит?

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

}

Ответы [ 3 ]

4 голосов
/ 07 февраля 2010

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

if (test[0] == '<') ...
1 голос
/ 07 февраля 2010

strcmp хочет, чтобы обе строки были завершены 0.

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

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

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

1 голос
/ 07 февраля 2010

вам нужно 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;
    }
}
...