-1

私は立ち往生し、これに何日も費やして検索しています。C を使用して単語頻度プログラムを作成する必要があります。衝突を追跡するためにリンクされたリストを使用しますが、私のコードでは適切な頻度が得られません (たとえば、「the」の頻度は 25 である必要がありますが、代わりに 18 です)。私は何を間違っていますか?. これが私のコードです:

void addToArr( char *str, HASH_ARR_ELEM hashArr[]){
int homeAddress = 0;
int addResult = 0;
WORD *tempWord;
homeAddress = hashFunct(str);

if(!(tempWord = (WORD*)malloc(sizeof(WORD))))
    printf("Memory Allocation Error\n"),
        exit(100);

strcpy(tempWord->str,str);
tempWord->count = 1;

if(hashArr[homeAddress].wordPtr == NULL){
    // allocate memory
    if(!(hashArr[homeAddress].wordPtr = (WORD*)malloc(sizeof(WORD))))
        printf("Memory Allocation Error\n"), exit(100);

    strcpy(hashArr[homeAddress].wordPtr->str,tempWord->str);
    hashArr[homeAddress].wordPtr->count = 1;

} else if(hashArr[homeAddress].wordPtr != NULL && hashArr[homeAddress].headPtr == NULL){        

    if(strcmp(hashArr[homeAddress].wordPtr->str,tempWord->str))
        hashArr[homeAddress].wordPtr->count++;
    else{
        hashArr[homeAddress].headPtr = createList(cmpWord);
        if(!hashArr[homeAddress].headPtr)
            printf("\aCannot create list\n"),
            exit(100);

        addNode(hashArr[homeAddress].headPtr,tempWord);
        }
}else
    if(strcmp(hashArr[homeAddress].wordPtr->str,tempWord->str))
        hashArr[homeAddress].wordPtr->count++;
    else 
    {
        addResult = addNode(hashArr[homeAddress].headPtr,tempWord);
        if(addResult != 0)
            if(addResult == -1)
                printf("Memory Overflow adding node\n"),
                    exit(120);
            else
            {
                retrieveNode(hashArr[homeAddress].headPtr,tempWord,(void**)&tempWord);
                tempWord->count++;
                    printf("%s %d\n\n", tempWord->str, tempWord->count);
            }
    }
 } // end addToArr
4

2 に答える 2

2

問題の少なくとも 1 つは文字列比較行にあります。

strcmp2 つの文字列が等しい場合に返さ0れます。これは、文字列が異なる場合にのみカウントをインクリメントしていることを意味します。

于 2012-05-05T03:32:09.307 に答える
0

私がこれを正しく読んでいれば、文字列が等しい場合に if(strcmp(...)) が true になると予想されます。ただし、文字列が等しい場合は 0 を返します。

したがって、この:

if(strcmp(hashArr[homeAddress].wordPtr->str,tempWord->str))

これでなければなりません:

if(!strcmp(hashArr[homeAddress].wordPtr->str,tempWord->str))

strcmp は最初の違いの位置を教えてくれるので、0 より大きい数値はすべて違いになるので、文字列が等しいために残っているのは 0 だけです。

于 2012-05-05T03:32:35.843 に答える