我目前正在用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];
};
任何想法?感谢。
答案 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;
};