2012-12-11 3 views
1

특정 단어가 입력 된 횟수를 계산할 때 하위 문자열을 사용하고 싶습니다. 코드를 약간만 사용하여 작동하게 만들었습니까? 그러나 나는 그것을 얻지 않는다!하위 문자열을 사용하여 단어가 나타나는 횟수를 계산하십시오.

내 코드는 다음

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

int main(int argc, char *argv[]) 
{ 

int i=0; 

char buf[1026]={'\0'}; 
char *p="#EOF\n"; 
char *t; 

while (strcmp(buf, p) != 0) 
{ 
    fgets(buf, 1025, stdin); 
    t=strtok(buf," , - \n"); 
    while(t != NULL) 
    { 
     if(strncmp(t, argv[1], strlen(argv[1])) == 0) 
    { 
     i++; 
    } 
    } 
} 






printf("%d\n", i); 

return 0; 
} 

이 오류가 없지만, i의 값이 나는 그것이 한 번 말씀을 발견 한 후 카운트를 계속 확인하는 방법을 모른다 항상 0입니다. 나는 sizeof(t) < j을 시도했지만 작동하지 않습니다. 귀하의 경우, 그것은 당신의 플랫폼의 포인터의 단지 크기 인 sizeof(char*)을 그래서

+1

아마도 'sizeof' 대신에'strlen'을 원할 것입니다. – cnicutar

+0

@cnicutar 고쳤습니다. 고마워요! –

+0

이것은 나에게 매우 비효율적 인 것처럼 보입니다. 문자열을 부분 문자열로 파싱하는 이유는 무엇입니까? 구분 기호를 찾아 결과를 계산하면됩니다. 문자열을 수정하는 데 낭비 할 이유가 없습니다. 'strpbrk()'과 같은 것을 사용하여 여러 문자 중 하나의 다음 항목을 찾거나 자신의 도움말 기능을 작성하십시오. –

답변

0
while(sizeof(t) > j) 

sizeof는 당신에게 유형의 크기를 알려줍니다. 대부분 4 또는 8 일 가능성이 큽니다. strlen으로 바꾸십시오. 문자열의 크기를 알려주기 위해 설계되었습니다.

2

토큰의 인스턴스가 두 개 이상인 경우 strtok을 여러 번 호출해야합니다. 후속 호출에서는 첫 번째 인수로 NULL을 전달합니다. man page

또한 sizeof (t)는 상수이며, 아마 4 또는 8입니다. t는 char 포인터이며, 약간의 바이트를 차지합니다. strtok이 NULL을 비교하기를 원하는 결과를 리턴했는지 살펴 보려는 경우. 남자 페이지에서 :

반환 값

The strtok() and strtok_r() functions return a pointer 
    to the next token, or NULL if there are no more tokens. 

널 (NULL)은 그 라인에 더 이상 토큰이 없음을 결정하기 위해 검사 할 것입니다.

또한 토큰이 두 번의 읽기를 연결하면 얻을 수 없습니다. 예를 들어, 줄 1은 ","로 끝나고 다음 준비는 "- \ n"으로 시작합니다.

+0

코드를 위의 코드로 변경했는데, 이것이 의미하는 바가 아닐까요? –

+0

구분 된 텍스트의 다른 비트를 찾으려면 strtok을 다시 호출해야합니다. while 루프에서 t가 재 할당되지 않으면 일치하는 무한 루프가 아닌데 놀랍습니다. –

+0

미안 하다니 무슨 뜻인지 모르겠다. 혹시 나에게 약간의 힌트를 주시겠습니까? –

관련 문제