0

基本的な要点は、テキスト ファイルから単語を読み取り、それらを文字列として格納し、関数を実行してから、これを複数回ループして、新しい行を読み取るたびにその文字列を書き換えることです。このループが完了したら、別の文字列を処理する必要があります。問題は、宣言時に 0 に memset したにもかかわらず、2 番目の文字列のバイトが、最初の文字列に割り当てたスペースよりも長い単語の余分な文字によって上書きされることです。

char* currDictWord = malloc(9*(sizeof(char));
char* currBrutWord = malloc(9*(sizeof(char));
memset(currBrutWord, 0, 9);
memset(currDictWord, 0, 9);

...

while (stuff) {

fscanf(dictionary, "%s", currDictWord);

}

...

printf("word: %s\n", currBrutWord);

currBrutWord はもう空ではありません。私がこれに対処した 2 つの方法は、currDictWord が辞書ファイル内の最長の単語よりも長いことを確認すること (一種のゲットー ソリューション) と、ループの後に currBrutWord で新しい memset を実行することです。別の変数に特別に割り当てたメモリへの書き込みを停止するように C に指示する方法はありませんか?

4

2 に答える 2

1

はい: 使用をやめてfscanf(できれば -ファミリー全体scanfを) 使用fgetsし、代わりに使用してください。変数に読み込む最大バイト数を渡すことができます。

編集:(コメントに応じて)

fgetscountバイトが読み取られるか、文字列に含まれる改行が見つかるまで読み取りを停止します。そのfgetsため、文字列の最後に改行があるかどうかを確認した後 (必要に応じて削除します)。fgetc次のように、改行が見つかるまでファイルの文字列に改行がない場合:

fgets(currDictWord, 9, dictionary);
if(currDictWord[strlen(currDictWord) - 1] != '\n'){
    while(fgetc(dictionary) != '\n'); /* no body necssary */
    /* the stream-pointer is now a the beginning of the next line */
}
于 2013-10-08T00:06:26.970 に答える
0

不適切な文字列の割り当てと、ファイルから読み取ったデータを検証していない。

currBrutWordへの書き込みが多すぎるため、 はオーバーランcharscurrBrutWordます。あなたがした場合、同じことが起こったでしょう:

strcpy(currBrutWord, "123456789");  // Bad as this copy 9+1 char into currBrutWord

を使用する場合fscanf()、次の方法でデータの読み取りを制限できます。

fscanf(dictionary, "%8s", currDictWord);

これにより fscanf()、 にデータを入れすぎないようにしcurrDictWordます。その部分は問題ありませんが、ファイルから予期しないデータが返されます。外部の世界からのデータに挑戦する必要があります。

if (NULL == fgets(bigbuf, sizeof bigbuf, dictionary)) {
  ; handle EOF or I/O error
}
// now parse and validate bigbuf using various tools: strtok(), sscanf(), etc.
int n;
if ((sscanf(bigbuf, "%8s%n", currDictWord, &n) < 1) || (bigbif[n] != '\n')) {
  ; handle error
}
于 2013-10-08T17:00:38.787 に答える