C ++ - Сравнение строк Функция не работает? - PullRequest
0 голосов
/ 06 ноября 2010

В настоящее время я пишу средство распознавания токенов HTML на c ++.Я использую стеки, чтобы проверить и увидеть, есть ли начальные и совпадающие теги.

Прежде чем я смогу сопоставить свои теги, мне нужно убедиться, что тег правильный.Но по какой-то причине моя функция проверки не работает.Я перехожу каждый шаг в алгоритме и из всего, что я вижу, это должно работать.И все же он каждый раз возвращает ложь.Вот мой код:

const int NUM_TAGS = 12;
char *tagNames[NUM_TAGS] = 
{
    "<html>",
    "</html>",
    "<head>",
    "</head>",
    "<title>",
    "</title>",
    "<body>",
    "</body>",
    "<p>",
    "</p>",
    "</>",
    "<SPOT/>",
};

bool check_ValidTag(char check[])
{
    for (int i=0; i<=NUM_TAGS; i++)
    {       
        if (check==tagNames[i])
             return true;
    }

    return false;
};

Я вызываю функцию так:

 tok.isValid = check_ValidTag((char*)tok.str);

По запросу Вот как выглядит структура "tok" ..

struct token 
{
  char name[MAX_NAME + 1];
  int type;
  bool isValid;
  char str[MAX_LENGTH + 1];
 };

Есть идеи?Спасибо.

Ответы [ 4 ]

2 голосов
/ 06 ноября 2010

Вы сравниваете указатели, а не содержимое строк.Заменить

 char *tagNames[NUM_TAGS] = 

на

std::string tagNames[NUM_TAGS] = 
1 голос
/ 06 ноября 2010

Оператор == на char * не сравнивает содержимое строк.Он сравнивает адреса строк.Если вы работаете со строками в стиле C, вы должны использовать strcmp для их сравнения.

Однако, поскольку это помечено как C ++, я бы рекомендовал использовать std::string вместо char *.

0 голосов
/ 06 ноября 2010

Или, если вы хотите остаться c-plus-plussy, вы можете использовать функцию compare() из char_traits<char>.

typedef std::char_traits<char> ct;

bool check_ValidTag(char check[])
{
    size_t check_len = ct::length(check);
    for (int i=0; i<=NUM_TAGS; i++)
    {       
        if( 0 == ct::compare(check, tagNames[i], check_len) )
            return true;
    }

    return false;
};

См. Документацию на сайте www.cplusplus.com .

0 голосов
/ 06 ноября 2010

Как отмечали другие люди, вы сравниваете указатель с массивом символов (не с фактическим содержимым строки).Если вы можете изменить реализацию на использование std :: string, перегруженный оператор "==" должен помочь вам.

Однако, если вам нужно придерживаться массива char.Сделай это в стиле c:

{
  if(strcmp(check, tagNames[i])==0)
}
...