2011-03-09 4 views
1

내가 내가 위의 문자열에서C에서 문자열의 중복 단어를 확인하는 방법은 무엇입니까?

char a[]="This is it This"; 

처럼 astring에 중복 단어를 찾을 필요가 C의 문제를 해결하고 "이것은"두 번 그래서 난 하나를 계산하고 싶습니다 나타납니다.

누구나이 방법을 제안 할 수 있습니까?

+2

이 숙제가 있습니까? strtok (문자열 분리) 및 strcmp를 참조하여 strtok의 각 토큰에서 중복이 있는지 확인하십시오. strcmp와 포인터 조작을 사용하여 검색 문자열을 찾고 문자열을 한 번에 한 바이트 씩 이동할 수도 있습니다. 이 고양이를 껍질을 벗기는 데는 여러 가지 방법이 있습니다. – jmq

+0

정확하게 숙제가 아니야. @Jmquigley와 나는 표준 문자열 함수를 사용하지 않고 그것을해야만한다. –

+0

"하나로 계산한다"는 것은 무엇을 의미합니까? 두 번째를 제거 하시겠습니까? 두 번째 발생에 대한 포인터? 조금 더 많은 정보가 필요합니다. – jmq

답변

1

다음은 요청하는 프로그램입니다. 최대 99 자의 4 단어에 대해 하드 코딩됩니다. 그것은 쉽게 바뀔 수 있습니다. 나는 당신의 의견에 맞추기 만하면됩니다. 나는 또한 strcmpstrcpy을 사용했다. 이 두 함수는 모두 직접 구현할 수 있습니다 (mystrcpy 및 mystrcmp라고 부르거나 포함 시키십시오). 난 당신을 위해 문자열 함수를 다시 작성하지 않을거야. 나는 다른 대답에 기초하여 strtok을 피하는 방법을 보여 주었다. 나는 그것들을 찾았고 복잡하지는 않지만 프로그램에 아무 것도 추가하지 않았고 나는 바퀴를 재발 명하고 싶지 않았다. 마지막으로, 방금 notInArray 함수에서 간단한 선형 검색을 사용했습니다. 대용량 데이터 세트의 경우 이는 효율적이지 않습니다 (일부 유형의 트리 또는 해시 사용).

~>a 
This is a This 

This 
is 
a 
strarr[0]=This 
strarr[1]=is 
strarr[2]=a 

Unique wordcount = 3 

가 즐기십시오 :

는 GCC 버전에서 컴파일 된 4.3.4

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

int notInArray(char arr[][100], char *word, int size); 

int main() { 
    char a[] = "This is a This"; 
    char *ptr; 
    char strarr[4][100]; 
    char word[100]; 
    int pos = 0; 
    int count = 0; 
    int i; 

    memset(&strarr,0,sizeof(strarr)); 
    printf("%s\n\n",a); 

    ptr = a; 
    while (*ptr) { 

    sscanf(ptr, "%s ", word); 
    if (notInArray(strarr,word,4)) { 
     strcpy(strarr[pos++],word); 
     printf("%s\n", word); 
    } 

    while (!isspace(*ptr++) && *ptr) {} 
    } 

    for (i=0; i<4; i++) { 
    if (*strarr[i]) { 
     printf("strarr[%d]=%s\n",i, strarr[i]); 
     count++; 
    } 
    } 

    printf("\nUnique wordcount = %d\n", count); 

    return(0); 
} 

int notInArray(char arr[][100], char *word, int size) { 
    int i; 

    for (i=0; i<size; i++) { 
    if (*arr[i] && !strcmp(arr[i],word)) { 
     return(0); 
    } 
    } 

    return(1); 
} 

출력은 같다.

+0

당신의 노력에 감사드립니다. 위 코드를 작성하는데 얼마나 많은 돈이 들었는지 알고 싶습니까? –

+0

이 프로그램은 쓰기가 그렇게 어렵지 않았습니다. sscanf를 많이 사용하지 않았기 때문에 sscanf를 찾아야했습니다.이 유형의 구문 분석 코드를 작성하는 것이 "일반적인"방법이 아닙니다. 일반적으로 strtok 함수가 더 나은 옵션입니다. – jmq

+0

어쨌든 ur 도움을위한 감사합니다 @jmquigley 및 그것을 조금 더 쉬운시키는 것을 시도하고있다 ... –

0

나는 한 번에 한 단어 씩 읽을 것입니다. (예 : sscanf [편집 : 방금 주석을 보았습니다. 문자열 기능이 없어도 꽤 쉽습니다.] 검색하여 공백/비 공백 문자를 찾아서 찾습니다. 단어 - 짜증나지만 주요하지 않음) 배열에 넣을 수 있습니다 (또는 위에 표시된 것보다 훨씬 많은 경우 이진 검색 트리).

각 단어가 발생하는 횟수를 계산하려면 각 노드에 int (또는 기타)를 사용할 수 있습니다. 입력에서 고유 한 단어를 알고 싶다면 단어 수만 제외하면됩니다.

관련 문제