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时弄乱了逻辑我已经阅读了你之前的评论,我会编辑它,但在我解决了手头的问题之后。(否则一长串问题永远无法完成)我已经阅读了你之前的评论,我会在解决了手头的问题后对其进行编辑。(否则,一长串问题将永远无法完成)