c++面试题;提取email地址,该怎么解决

c++面试题;提取email地址
内容如下:
 souhu@sina.com souhu@sina.com sdfjk.com 

sssdf@sdf.cn
sdfhi
sss.@guo.com sdf@.u.com

sdfkj
shiguojie1989@sina.com
sdfkjsss shiguojie1989@sina.com dkfjjk 

shiguojie1989@sina.com
 sdlkfj shiguojie1989@sina.com 
sdfkj@sdkfjk sfi shiguojie1989 @skdfjk
@@@ www.@shiguojie1989@sina.com

下面是我回家苦思冥想的代码:
#include <STDIO.H>
#include <IOSTREAM>
#include <FSTREAM>
#include <windows.h>
#include <ASSERT.H>
#include <VECTOR>
#include <STDIO.H>

using namespace std;
//下面合法字集
const char a[]="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";

bool Find_at(const char _a)
{
if ('@' == _a)
{
return true;
}
return false;
}

bool Find_dian(const char _a)
{
if ('.' == _a)
{
return true;
}
return false;
}

bool Find_a(const char _a)
{
int i=0;

while(i<(sizeof(a)))
{
if (a[i] == _a)
{
return true;
}
i++;
}
return false;
}

int main()
{
char p_email[100] = {'\0'};
int find_i=1;
char* temp=NULL;
int t_size,i,j,m;
bool go_out=false;
bool d_flag=false;
bool b_copy=true;

FILE* fp = fopen("email.txt","r");
if (NULL == fp)
{
printf("read error!\r\n");
exit(1);
}
fseek(fp, 0, SEEK_END);
t_size=ftell(fp);
fseek(fp, 0, SEEK_SET);

temp=new char[t_size];
assert(temp);

fread(temp, t_size, 1, fp);

for (j=0; j<t_size; j++)
{
cout << temp[j];
}
cout << endl;
//start find @
i=1;
do 
{
while (!go_out)
{
if (Find_at(temp[i]))
{
if (((!Find_a(temp[i-1]))||(!Find_a(temp[i+1]))))
{
i++;
go_out=true;
break;
}

j=m=i;
j-=1;
m+=1;
if (m==t_size)//max size
{
break;
}

if (0 != j)//first begin
{
while(Find_a(temp[--j]))
{
if (0==j)
{
i++;
break;
//ok
}
}
j++;
}
else
{
if (!Find_a(temp[0]))
{
i++;
break;
}
}

while(1)
{
if (Find_a(temp[m]))//查找@后面的.以及.后面的字母
{
m++;
if (m==t_size)
{
break;
}
continue;
}
if (Find_dian(temp[m])&&Find_a(temp[m+1]))//find . and after.
{
m+=1;
if (m==t_size)
{
memset(p_email, 0, 100);
for(int n=0; n<m-j;n++)
{
p_email[n]=temp[j+n];
}
cout << find_i++ << ":" << p_email << endl;
b_copy=false;
break;//最后一个email
}
while(Find_a(temp[++m]))
{
if (m==t_size)
{
memset(p_email, 0, 100);
for(int n=0; n<m-j;n++)
{
p_email[n]=temp[j+n];
}
cout << find_i++ << ":" << p_email << endl;
b_copy=false;
break;//最后一个email
}
}

if (b_copy)
{
memset(p_email, 0, 100);
for(int n=0; n<m-j;n++)
{
p_email[n]=temp[j+n];
}
cout << find_i++ << ":" << p_email << endl;
}
m++;
i=m;
break;
}
else
{
m++;
i=m;
break;

}
}
}
else
{
i++;
}
}
go_out=false;
} while (i < t_size);

system("pause");
return 1;
}

------解决方案--------------------
那就接分了c++面试题;提取email地址,该怎么解决
------解决方案--------------------
同接分。。
不过感觉LZ写的太复杂了,一个小程序需要这么多行代码么?
写时不知行珍贵,调试望码空流泪啊。
------解决方案--------------------
有这功夫还不如学用正则表达式呢。
正则表达式速查 正则表达式举例 正则表达式学习 (4页A4纸)http://download.****.net/detail/zhao4zhong1/1808549
#include <iostream>
#include <string>
#include <regex>
using namespace std;
int main() {
    string s("deabc\ndeab\ndefabc");
    cout << s << endl;
    cout << "----" << endl;
    regex e("abc$");