C ++ - 比较字符串函数不起作用?

时间:2010-11-05 21:18:34

标签: c++ html string pointers tokenize

我目前正在用c ++编写HTML令牌识别器。我正在使用堆栈来检查是否有开始和匹配的标签。

在我匹配我的标签之前,我需要确保标签有效。但由于某种原因,我的检查功能无效。我逐步完成算法中的每一步,从我认为应该工作的一切。然而它每次都是假的。这是我的代码:

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

As Requested这里是结构“tok”的样子..

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

任何想法?感谢。

4 个答案:

答案 0 :(得分:2)

您正在比较指针,而不是字符串的内容。取代

 char *tagNames[NUM_TAGS] = 

std::string tagNames[NUM_TAGS] = 

答案 1 :(得分:1)

==上的char *运算符不会比较字符串的内容。它比较字符串的地址。如果您使用的是C风格的字符串,则应使用strcmp进行比较。

但是,由于这被标记为C ++,我建议您使用std::string代替char *

答案 2 :(得分:0)

正如其他人所指出的那样,你正在比较一个指向char数组的指针(而不是实际的字符串内容)。如果您可以将实现更改为使用std :: string,那么“==”重载运算符应该为您完成。

但是,如果你需要坚持使用char数组。做c风格:

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

答案 3 :(得分:0)

或者,如果你喜欢保持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;
};

请参阅documentation at www.cplusplus.com