C++ c+中的电子邮件解析器+;
如果可能的话,我想要一些关于这个电子邮件解析器的帮助 这段代码有所有正确的声明和初始化,但我不确定我在哪里弄乱了这个循环:C++ c+中的电子邮件解析器+;,c++,parsing,C++,Parsing,如果可能的话,我想要一些关于这个电子邮件解析器的帮助 这段代码有所有正确的声明和初始化,但我不确定我在哪里弄乱了这个循环: while ( getline( fin, lines ) ) { for ( int i = 0; i < lines.length( ); i++ ) { if ( lines[ i ] == '@' ) { for ( s = i; s < lines.length( );
while ( getline( fin, lines ) )
{
for ( int i = 0; i < lines.length( ); i++ )
{
if ( lines[ i ] == '@' )
{
for ( s = i; s < lines.length( ); s-- )
{
if ( s < 0 )
{
break;
}
if ( validChar( lines[ s ] ) == false )
{
break;
}
} //for
for ( e = i; e > lines.length( ); e++ )
{
if ( e == lines.length( ) )
{
break;
}
if ( validChar( lines[ e ] ) == false )
{
break;
}
if ( lines[ e ] == '.' )
{
hasDot = true;
}
} // for
anEmail = lines.substr( s, e );
cout << anEmail << endl;
}
} // if
} // while
while(getline(fin,line))
{
对于(inti=0;ilines.length();e++)
{
if(e==lines.length())
{
打破
}
if(validChar(行[e])==false)
{
打破
}
如果(第[e]='.'行)
{
hasDot=true;
}
}//为了
anEmail=行。子行(s,e);
您的问题在这里:
for ( s = i; s < lines.length( ); s-- )
{
//...
if ( validChar( lines[ s ] ) == false )
{
break;
}
} //for
(s=i;s
{
//...
if(validChar(行数])==false)
{
打破
}
}//为了
您正在检查行[s]
是否有效,以决定是否终止;但是行[s]=='@
一开始,因为你刚刚找到了@
!如果你将s
初始化为i-1
,你会更接近…但是你会发现你的substr
中有一大堆的off-by-one。你最终需要做anEmail=line.substr(s+1,e+1);
但这只会导致代码通过您的测试用例。这不是解析电子邮件地址的有效方法。此方法不适用于所有有效的电子邮件地址,包括“an@sign“@foo
和”空格仅在引号中合法”@foo
。您还需要扩展validChar以处理实际的有效字符集,这些字符因名称和域而异;!#$%&'*+-/=?^{}| ~@[IPv6:2001:db8:1ff::a0b:dbd0]
是完全合法的。最后,如果对您来说真正排除非法地址很重要,您将再次受到这种方法的限制:double。。dot@foo
不合法,double@at@foo
这个问题的来源是RFC822(或者它是更新得多的兄弟RFC5322和RFC6531),在这里您会发现正则表达式无法解析电子邮件,因为name(comment(comment))@foo
是合法的,而name(comment))@foo
不是合法的。您的问题是:
for ( s = i; s < lines.length( ); s-- )
{
//...
if ( validChar( lines[ s ] ) == false )
{
break;
}
} //for
(s=i;s
{
//...
if(validChar(行数])==false)
{
打破
}
}//为了
您正在检查行[s]
是否有效,以决定是否终止;但是行[s]=='@
一开始,因为你刚刚找到了@
!如果你将s
初始化为i-1
,你会更接近…但是你会发现你的substr
中有一大堆的off-by-one。你最终需要做anEmail=line.substr(s+1,e+1);
但这只会导致代码通过您的测试用例。这不是解析电子邮件地址的有效方法。此方法不适用于所有有效的电子邮件地址,包括“an@sign“@foo
和”空格仅在引号中合法”@foo
。您还需要扩展validChar以处理实际的有效字符集,这些字符因名称和域而异;!#$%&'*+-/=?^{}| ~@[IPv6:2001:db8:1ff::a0b:dbd0]
是完全合法的。最后,如果对您来说真正排除非法地址很重要,您将再次受到这种方法的限制:double。。dot@foo
不合法,double@at@foo
其源代码是RFC822(或者是更新得多的同级RFC5322和RFC6531),您会发现正则表达式无法解析电子邮件,因为
name(comment(comment))@foo
是合法的,而name(comment))@foo
不是。我可以建议您尝试稍微改进缩进吗?这很难阅读,尤其是因为您在for
循环的外部中有这么多代码。您能给出一些输入和预期输出的示例吗?请给出一个示例,或者我们正在猜测(我不打算花时间去做!)。修复了缩进,不要相信我在执行某些操作时弄乱了逻辑。我建议您尝试稍微改进缩进?这很难阅读,尤其是因为外部for
循环中有太多代码。您能给出一些示例输入和预期输出吗?请给出一个示例,或者我们正在猜测(我不打算花时间去做!)修复了缩进,不要相信我在做soI时弄乱了逻辑我已经阅读了你之前的评论,我会编辑它,但在我解决了手头的问题之后。(否则一长串问题永远无法完成)我已经阅读了你之前的评论,我会在解决了手头的问题后对其进行编辑。(否则,一长串问题将永远无法完成)