1

こんにちは私は文字列の配列に辞書があり、バイナリ検索を使用して辞書内の単語を検索するスペルチェッカーをcで作成しています。

私の問題は、ファイルからテキストを読み取って、次のように強調表示された間違った単語で新しいファイルにテキストを出力しようとしていることです:**スペルミス**しかし、ファイルには。、!?などの文字が含まれます これは新しいファイルに出力されるはずですが、単語を辞書と比較するときに明らかに存在しません。

だから私はこれが欲しい:

text file: "worng!"

new file: "** worng **!"

私はこれを可能な限り解決しようとしており、グーグルでかなり長い間過ごしてきましたが、解決策に近づくことはできません。これまでに次のコードを記述して、各文字を読み取り、2つの文字配列を埋めます。1つは辞書比較用の小文字の温度で、もう1つは句読点がない場合に機能する元の単語の入力ですが、句読点がある場合は明らかにこのようにスペースを失います。これを行うためのより良い方法があると確信していますが、私はそれを見つけることができないので、ポインタをいただければ幸いです。

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

#define MAX_STRING_SIZE 29  /*define longest non-technical word in english dictionary plus 1*/

/*function prototypes*/
int dictWordCount(FILE *ptrF);  /*counts and returns number of words in dictionary*/
void loadDictionary(char ***pArray1, FILE *ptrFile, int counter);   /*create dictionary array from file based on word count*/
void printDictionary(char **pArray2, int size); /*prints the words in the dictionary*/
int binarySearch(char **pArray3, int low, int high, char *value);   /*recursive binary search on char array*/

void main(int argc, char *argv[]){
    int i;  /*index*/
    FILE *pFile;    /*pointer to dictionary file*/
    FILE *pInFile;  /*pointer to text input file*/
    FILE *pOutFile; /*pointer to text output file*/
    char **dict;    /*pointer to array of char pointer - dictionary*/
    int count;      /*number of words in dictionary*/
    int dictElement;    /*element the word has been found at returns -1 if word not found*/

    char input[MAX_STRING_SIZE];    /*input to find in dictionary*/
    char temp[MAX_STRING_SIZE];
    char ch;    /*store each char as read - checking for punctuation or space*/
    int numChar = 0; /*number of char in input string*/

    /*************************************************************************************************/
    /*open dictionary file*/
    pFile = fopen("dictionary.txt", "r");   /*open file dictionary.txt for reading*/
    if(pFile==NULL){    /*if file can't be opened*/
        printf("ERROR: File could not be opened!/n");
        exit(EXIT_FAILURE);
    }

    count = dictWordCount(pFile);
    printf("Number of words is: %d\n", count);

    /*Load Dictionary into array*/
    loadDictionary(&dict, pFile, count);

    /*print dictionary*/
    //printDictionary(dict, count);
    /*************************************************************************************************/
    /*open input file for reading*/
    pInFile = fopen(argv[1], "r");
    if(pInFile==NULL){  /*if file can't be opened*/
        printf("ERROR: File %s could not be opened!/n", argv[1]);
        exit(EXIT_FAILURE);
    }
    /*open output file for writing*/
    pOutFile = fopen(argv[2], "w");
    if(pOutFile==NULL){ /*if file can't be opened*/
        printf("ERROR: File could not be created!/n");
        exit(EXIT_FAILURE);
    }

    do{
        ch = fgetc(pInFile);                /*read char fom file*/

        if(isalpha((unsigned char)ch)){     /*if char is alphabetical char*/
            //printf("char is: %c\n", ch);
            input[numChar] = ch;            /*put char into input array*/
            temp[numChar] = tolower(ch);    /*put char in temp in lowercase for dictionary check*/
            numChar++;                      /*increment char array element counter*/
        }
        else{
            if(numChar != 0){
                input[numChar] = '\0';  /*add end of string char*/
                temp[numChar] = '\0';

                dictElement = binarySearch(dict,0,count-1,temp);    /*check if word is in dictionary*/

                if(dictElement == -1){  /*word not in dictionary*/
                    fprintf(pOutFile,"**%s**%c", input, ch);
                }
                else{   /*word is in dictionary*/
                    fprintf(pOutFile, "%s%c", input, ch);
                }
                numChar = 0;    /*reset numChar for next word*/
            }
        }
    }while(ch != EOF);

    /*******************************************************************************************/
    /*free allocated memory*/
    for(i=0;i<count;i++){
        free(dict[i]);
    }
    free(dict);

    /*close files*/
    fclose(pInFile);
    fclose(pOutFile);

}
4

2 に答える 2

1

あなたの問題を正しく理解しているかどうかは 100% 確信が持てませんが、やってみます。

まず、あなたのループ

do{
    ch = fgetc(pInFile);
    /* do stuff */
}while(ch != EOF);

ファイルの終わりに達したときにも実行されるため、ファイルの最後のバイトがアルファベット順である場合、出力ファイルに不要なバイトを出力するか、に渡すときに にEOFキャストchするため、通常は255 [および 8 ビットの場合]、一部のロケール (en_US.iso885915 など) ではアルファベット文字と見なされ、入力ファイルの最後の単語が抑制されます。unsigned charisalpha()EOF = -1unsigned char

これに対処するには、まず、chに渡すときにキャストしないでください。isalpha()次に、ループに何らかのロジックを追加して、意図しない の処理を​​防ぎEOFます。簡単なので、必要に応じて改行に置き換えることにしました。

次に、アルファベット文字の直後にない非アルファベット文字を出力する必要があります。

do{
    ch = fgetc(pInFile);                /*read char fom file*/

    if(isalpha(ch)){                    /*if char is alphabetical char*/
        //printf("char is: %c\n", ch);
        input[numChar] = ch;            /*put char into input array*/
        temp[numChar] = tolower(ch);    /*put char in temp in lowercase for dictionary check*/
        numChar++;                      /*increment char array element counter*/
    }
    else{
        if(numChar != 0){
            input[numChar] = '\0';  /*add end of string char*/
            temp[numChar] = '\0';

            dictElement = binarySearch(dict,0,count-1,temp);    /*check if word is in dictionary*/

            if(dictElement == -1){  /*word not in dictionary*/
                fprintf(pOutFile,"**%s**%c", input, (ch == EOF) ? '\n' : ch);
            }
            else{   /*word is in dictionary*/
                fprintf(pOutFile, "%s%c", input, (ch == EOF) ? '\n' : ch);
            }
            numChar = 0;    /*reset numChar for next word*/
        }
        else
        {
            if (ch != EOF) {
                fprintf(pOutFile, "%c",ch);
            }
        }
    }
}while(ch != EOF);
于 2012-04-04T21:36:32.243 に答える
0

文字がアルファベット順でない場合、elseブロックがトリガーif(isalpha((unsigned char)ch)){され、文字自体が無視されるようになりました。

アルファベット以外のすべての文字を入力したとおりに出力するステートメントを追加すると、目的が達成されると思います。elseこれは、そのブロック内とブロックの後に移動する必要がありif(numChar != 0){、単純な fprintf ステートメントになります。

于 2012-04-04T21:21:47.180 に答える