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
下面是我回家苦思冥想的代码:
------解决方案--------------------
那就接分了
------解决方案--------------------
同接分。。
不过感觉LZ写的太复杂了,一个小程序需要这么多行代码么?
写时不知行珍贵,调试望码空流泪啊。
------解决方案--------------------
有这功夫还不如学用正则表达式呢。
正则表达式速查 正则表达式举例 正则表达式学习 (4页A4纸)http://download.****.net/detail/zhao4zhong1/1808549
内容如下:
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;
}
------解决方案--------------------
那就接分了
------解决方案--------------------
同接分。。
不过感觉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$");