在函数读取字符串后尝试生成许多标记。
该程序是HTML词法分析器的一部分,我只想弄清楚逻辑。
对于如下字符串:字符串:"标题到达此处< / =>标题" 输出应为:TEXT LANGLE SLASH EQUAL SLASH TEXT END
含义之前的任何内容<>被认为是一个文本标记。当我在里面<,我有其他情况。当字符串结束时,生成END令牌
我的问题是,该程序陷入无限循环的END令牌。我知道我犯了一些愚蠢的错误,但我可以为我的生活弄清楚。
#include <iostream>
#include <fstream>
#include <string.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
void gettoken()
{
string wordin="there you were<=/>there";
for(unsigned int i = 0; i < wordin.length(); )
{
if(wordin.at(i)== '<')
{
cout<<("LANGLE")<<endl;
i++;
{
if(wordin.at(i)== '=')
{
i++;
cout<<("EQUAL")<<endl;
}
if(wordin.at(i)== '/')
{
i++;
cout<<("SLASH")<<endl;
}
if(wordin.at(i)== '>')
{
i++;
cout<<("RANGLE")<<endl;
}
} // internal LANGLE ends here
}
else if (isalpha(wordin[i])) {
unsigned int j=wordin.find('<') ;
i=j;
cout<<"TEXT"<<endl;}
}
cout<<"END"<<endl;
}
int main()
{
gettoken();
}
更新: 我修改了一些代码,现在它生成了TEXT LANGLE SLASH EQUAL LANGLE TEXT LANGLE SLASH EQUAL LANGLE等等,它应该像TEXT LANGLE SLASH EQUAL LANGLE TEXT END ..有人帮我解决了如何正确终止它。
答案 0 :(得分:3)
你在else语句中缺少一个i ++(输出“END”的那个)。这会导致无限循环。
在这种情况下,使用调试器比使用stackoverflow更快。
您的代码还有许多其他问题。考虑: - 使用智能缩进,否则,它很难阅读 - 使用调试器找出错误而不是将代码发布到stackoverflow ...; - )
这是一个有效且可读的代码:
#include <iostream>
#include <fstream>
#include <string.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
void gettoken()
{
string wordin="there you were<=/>there";
bool inTag = false;
for(unsigned int i = 0; i < wordin.size(); )
{
if(wordin.at(i)== '<')
{
cout<<("LANGLE")<<endl;
i++;
inTag = true;
}
else if ( inTag && wordin.at(i)== '=' )
{
i++;
cout<<("EQUAL")<<endl;
}
else if ( inTag && wordin.at(i)== '/' )
{
i++;
cout<<("SLASH")<<endl;
}
else if ( inTag && wordin.at(i)== '>' )
{
i++;
cout<<("RANGLE")<<endl;
inTag = false;
}
else if (isalpha(wordin[i]))
{
unsigned int j = wordin.find('<',i) ;
if ( j == std::string::npos )
{
i = wordin.size(); // move to end of string position
}
else
{
i=j;
cout<<"TEXT"<<endl;
}
}
}
cout<<"END"<<endl;
}
int main()
{
gettoken();
}
输出:
TEXT
LANGLE
EQUAL
SLASH
RANGLE
TEXT
END
希望这是你想要的......