/*
* 名稱:步步遞近網路蜘蛛(一)
*
* 版本:v1.0
*
* 作者:張雙喜
*
* 日期:2010.10.17
*
* 功能:從一段字串中,找出合法的網址(在html中文法表達中正確的網址)
*
* 過程設計:
* 根據html文法規則進行篩選出網址
* 1、函數:my_strncmp(char *p, char *q, int n)
* 功能:自己類比實現庫函數strncmp
*
* 2、函數:judge_mark(char **p)
* 功能:判斷是不是"<a "或" <a ",如果是,則進行下一步操作;
* 如果不是,返回NULL;
*
* 3、函數:judge_href(char **p)
* 功能:判斷是不是" href",如果是,則進行下一步操作;
* 如果不是,返回NULL;
*
* 4、函數:judge_equal_mark(char **p)
* 功能:判斷是不是" =",如果是,則進行下一步操作;
* 如果不是,返回NULL;
*
* 5、函數:judge_http(char **p)
* 功能:判斷是不是" http",如果是,則進行下一步操作;
* 如果不是,返回NULL;
*
* 6、函數:link(char **p)
* 功能:調用2、3、4、5函數,找到正確的網址
*
* 7、函數:pritnf_link(char *p)
* 功能:列印網址
* 備忘:到網址結尾時,要對結尾進行處理,否則會一塊把後面的a>等其他資訊也列印出來
*
* */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//自己實現的strncmp函數
int my_strncmp(char *p, char *q, int n)
{
int i = 0;
int count = 0;
for( i = 0; i < n; i++)
{
if(*(p+i) == *(q+i))
{
count++;
}
}
if(count == n)
{
return 0;
}
else
{
return 1;
}
}
//判斷是否滿足"<a "
char * judge_mark(char **p)
{
while(' ' == **p)
{
(*p)++;
}
if(0 == my_strncmp(*p, "<a ", 3))
{
*p = *p + 3;
return *p;
}
else
{
return NULL;
}
}
//判斷是否滿足**** href
char * judge_href(char **p)
{
while(' ' == **p)
{
(*p)++;
}
if(0 == my_strncmp(*p, "href", 4))
{
*p = *p + 4;
return *p;
}
else
{
return NULL;
}
}
//判斷是否滿足*** =
char * judge_equal_mark(char **p)
{
while(' ' == **p)
{
(*p)++;
}
if('=' == **p)
{
return (*p) + 1;
}
else
{
return NULL;
}
}
//判斷是否滿足** ["] ['] http
char * judge_http(char **p)
{
while((' ' == **p) || ('/"' == **p) || ('/'' == **p))
{
(*p)++;
}
if(('/"' == **p) || ('h' == **p) || ('/'' == **p))
{
return (*p);
}
else
{
return NULL;
}
}
//功能:產生要網址
char * link (char **p)
{
char *ret;
ret = judge_mark(p);
if(NULL != ret)
{
ret = judge_href(&ret);
}
if(NULL != ret)
{
ret = judge_equal_mark(&ret);
}
if(NULL != ret)
{
ret = judge_http(&ret);
}
return ret;
}
//列印網址
void printf_link(char *p)
{
int i = 0;
if(NULL != p)
{
while(((*(p+i) != '/"') && (*(p+i) != '/'') &&
(*(p+i) != '>') && (*(p+i) != '/0') && (*(p+i) != '
')))
{
printf("%c", *(p+i));
i++;
}
printf("/n");
}
return;
}
int main(int argc, char* argv[])
{
char *ret;
char *s1 = " <a href = /"http://www.akaedu.org/"> ok </a>";
char *s2 = " <a href = http://www.akaedu.org ";
char *s3 = "< a href = http://www.akaedu.org";
char *s4 = "<a href = /" http://www.akaedu./"org";
ret = link(&s1);
printf_link(ret);
ret = link(&s2);
printf_link(ret);
ret = link(&s3);
printf_link(ret);
ret = link(&s4);
printf_link(ret);
return 0;
}