代码之家  ›  专栏  ›  技术社区  ›  Johnrad

比较字符串函数不工作?

  •  0
  • Johnrad  · 技术社区  · 15 年前

    我正在用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);
    

    按要求这里是结构“tok”的样子。。

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

    有什么想法吗?谢谢。

    4 回复  |  直到 15 年前
        1
  •  0
  •   jbremnant    15 年前

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

    {
      if(strcmp(check, tagNames[i])==0)
    }
    
        2
  •  2
  •   eduffy    15 年前

    你在比较指针,而不是字符串的内容。替换

     char *tagNames[NUM_TAGS] = 
    

    std::string tagNames[NUM_TAGS] = 
    
        3
  •  1
  •   Mark Byers    15 年前

    这个 == 操作员打开 char * 没有比较 目录 在弦上。它比较了 地址 在弦上。如果使用的是C样式的字符串,则应使用 strcmp 来比较它们。

    std::string 而不是 字符*

        4
  •  0
  •   Zan Lynx    15 年前

    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