2010-01-25 7 views
3

이것은 파일의 URL 목록을 읽고 URL의 여러 부분을 분리하려고하는 내 C 코드입니다.이 코드는 거친 구문 분석이며 특별한 경우에 대해 신경 쓰지 않습니다. 오류가 sscanf() 문을, 내가 이것을 실행할 때 "세분화 FAULT".. 그리고 또한, 전체 URL은 "proto"문자열에 할당되고있다 .. 아무도 제발 문제를 알아낼 수 있습니다 .. 제발 그것은 급한 ..sscanf()를 사용하여 c에서 URL을 구문 분석하는 방법은 무엇입니까?

#include<stdio.h> 
#include<string.h> 
#include<stdlib.h> 

# define BAG_SIZE 14 

char bag[117][30]; 

void initbag() 
{ 
strcpy(bag[0],"account"); 
strcpy(bag[1],"audit"); 
strcpy(bag[2],"ad"); 
strcpy(bag[3],"advertising"); 
strcpy(bag[4],"marketing"); 
strcpy(bag[5],"application"); 
strcpy(bag[6],"banking"); 
strcpy(bag[7],"barter"); 
strcpy(bag[8],"business"); 
strcpy(bag[9],"econo"); 
strcpy(bag[10],"commerce"); 
strcpy(bag[11],"communication"); 
strcpy(bag[12],"computer"); 
strcpy(bag[13],"processing"); 
} 
/* 
other bag[] values will be later copied 
*/ 

void substr(char dest[10],char src[200],int start,int len) 
{ 
int i,j; 

for(i=start,j=0;i<start+len;i++,j++) 
dest[j]=src[i]; 
dest[j]='\0'; 

} 

int found(char* word) 
{ 
    int i; 
    for(i=0;i<BAG_SIZE;i++) 
    if((!strcmp(word,bag[i]))||(strstr(bag[i],word)!=NULL)) return 1; 
    return 0; 
} 

void main() 
{ 
int i,j,k; 

char buff[10],fullurl[100]; 
char proto[5],www[4],host[100],tokens[200],tld[4]; 
float feature[11];for(i=0;i<11;i++) feature[i]=0; 
FILE *furl,*fop; 
furl=fopen("bizurls.txt","r"); 
fop=fopen("urlsvm.txt","w"); 
initbag(); 
printf("\nbag initialised");fflush(stdout); 

while(!feof(furl)) 
{ 
    fscanf(furl,"%s",fullurl); 
    printf("%s",fullurl); 
    sscanf(fullurl,"%s://%s.%s.%s/%s\n",proto,www,host,tld,tokens);// this line isnt working properly 
    printf("2hi");fflush(stdout); 
    printf("proto : %s\nwww:%s\nhost :%s\ntld:%s\ntokens:%s\n",proto,www,host,tld,tokens);fflush(stdout); 


    for(i=4;i<=8;i++) 
    { 
     for(j=0;j<strlen(host)-i+1;j++) 
      { 
       substr(buff,host,j,i); 
       if(found(buff)) feature[i-3]++; 

      } 
    } 
    if((!strcmp(tld,"biz"))||(!strcmp(tld,"org"))||(!strcmp(tld,"com"))||(!strcmp(tld,"jobs"))) 
     feature[0]=1; 
    else if((!strcmp(tld,"info"))||(!strcmp(tld,"coop"))||(!strcmp(tld,"net"))) 
     feature[0]=0.5; 
    else 
    feature[0]=0; 


    for(i=4;i<=8;i++) 
    { 
     for(j=0;j<strlen(tokens)-i+1;j++) 
      { 
       substr(buff,tokens,j,i); 
       if(found(buff)) feature[i+2]++; 

      } 
    } 

/*.biz · .com · .info · .name · .net · .org · .pro 
.aero, .coop, .jobs, .travel */ 

for(i=0;i<11;i++) fprintf(fop," %d:%f",i,feature[i]); 
fprintf(fop,"\n"); 


} 
fflush(fop); 
fclose(furl); 
fclose(fop); 
} 
+0

쪽 이죠 .- 야, 이것 참, 사람들은 하드 충분한 시간 전체 전원 정규식 엔진이 일이있다. scanf 형식의 문자열로는 매우 어려울 것이라고 생각합니다 :-) – paxdiablo

+0

항상 * scanf 함수의 반환 값을 확인해야합니다. Kenny가 언급했듯이,'sscanf'는 URL 스캔을위한 잘못된 도구입니다. –

+0

더 많은 코드를 게시 할 수 있습니까? 당신의 현이 얼마나 큽니까? 어떤 명령이 segfaults입니까? –

답변

0

proto 전체 fullurl 일치하는 것이기 때문에 그것은 작동하지 않습니다 나머지는 타의 추종을 불허 할 것이다. 적절한 URL 구문 분석 함수를 사용하거나 정규식을 사용해야합니다.

1

sscanf의 % s는 첫 번째 공백 문자, 문자열의 끝 또는 지정된 최대 길이에 도달 할 때만 중단됩니다. URL은 공백이 없으므로 proto가 fullurl이되는 이유입니다.

proto는 5 바이트 (예 : https를 포함하지 않는 4 바이트의 데이터 만 포함) 만 포함 할 수 있으므로 전체 URL을 넣으면 버퍼 오버플로/세그먼트 오류가 발생합니다 . sscanf는이 점에서 다소 문제가 있습니다. % s를받는 각 문자 버퍼가 전체 문자열 (\ 0)을 담을만큼 충분히 커야한다는 문서 요청. 여기