2010-11-05 2 views
0

В настоящее время я пишу HTML-распознаватель токенов в C++. Я использую стеки, чтобы проверить, есть ли начальные и соответствующие теги.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]; 
}; 

Любые идеи ? Благодарю.

+0

Что такое 'tok.str'? – Jacob

+0

Я не вижу, где определяется темп. – prolink007

+0

Любая причина, по которой следы следов SPOT? (Может быть, это его собственный тег?) – John

ответ

0

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

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

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

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

char *tagNames[NUM_TAGS] = 

с

std::string tagNames[NUM_TAGS] = 
1

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

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

0

Или, если Вы хотели бы остановиться с-плюс-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; 
}; 

См. documentation at www.cplusplus.com.

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