1

「words.dat」という名前のファイルから取得した、最大 17 文字の 20 文字の文字列の配列を作成しようとしています。その後、プログラムは最初の 17 文字のみを表示する文字列を切り捨て、残りの文字列を完全に無視する必要があります。でも

私の質問は次のとおりです。これを達成する方法がよくわかりません。このタスクを達成する方法について誰かが私に洞察を与えることができますか?

これが私の現在のコードです。

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

    #define WORDS 20
    #define LENGTH 18

    char  function1(char[WORDS][LENGTH]);

int main( void )
{

    char word_array [WORDS] [LENGTH]; 

    function1(word_array);

    return ( 0 ) ;

}

char function1(char word_array[WORDS][LENGTH])
{
    FILE *wordsfile = fopen("words.dat", "r");
    int i = 0;

    if (wordsfile == NULL)
        printf("\nwords.dat was not properly opened.\n");
    else
    {
        for (i = 0; i < WORDS; i++)
        {
            fscanf(wordsfile, "%17s", word_array[i]);
            printf ("%s \n", word_array[i]);
        }
        fclose(wordsfile);
    }
    return (word_array[WORDS][LENGTH]);
}

words.dat ファイル:

Ninja
 DragonsFury
  failninja
   dragonsrage
    leagueoflegendssurfgthyjnu
     white
      black
       red
        green
         yellow
          green
           leagueoflegendssughjkuj
            dragonsfury
             Sword
              sodas
               tiger
                snakes
                 Swords
                  Snakes
                   sage

出力例:

blahblah@fang:~>a.out
Ninja 
DragonsFury 
failninja 
dragonsrage 
leagueoflegendssu 
rfgthyjnu 
white 
black 
red 
green 
yellow 
green 
leagueoflegendssu 
ghjkuj 
dragonsfury 
Sword 
sodas 
tiger 
snakes 
Swords 
blahblah@fang:~>

このプログラムでその後達成されることは次のとおりです。

function1 が適切に動作した後、2 つ目の関数名「function2」を作成します。この関数は、配列全体を調べて、 case を含む「EXACTLY」に一致する一致する単語のペアを探します。その後、前に作成した words.dat ファイルから 20 文字の文字列と一致する単語を表示する 3 番目の関数を作成します。

4

2 に答える 2

2

あなたのループの変更で

fscanf(wordsfile, "%17s", word_array[i]);

fscanf(wordsfile, "% 17s%*[^\n]\n", word_array[i]);

基本的には次のとおりです。

  1. %17s、これは明らかです、最大17文字を読み取り、それをword_arrayに入れます
  2. %*[^\n]、これは \n 以外のすべての文字を読み取り、それらをドロップします ( *)
  3. \n改行文字を読み取ります

コード内のこの 1 行を置き換えてテストしたところ、問題なく動作しました。

他の人が述べたように、呼び出しから への戻り値を見てくださいfunction1。それは基本的word_array[20][18]に であり、これは配列の制限の 2 倍です。の 21 番目の要素の 19 番目の文字ですword_array。そして、あなたはそれらのどれも持っていません。この関数は、値を返さなければ同じように機能します。

于 2013-11-11T21:51:27.597 に答える
1

注意すべき点がいくつかあります。まず、アクセスできないメモリ位置にあるfunction1文字ではなく、読み取られた単語数のカウントを返すことをお勧めします。word_array[WORDS][LENGTH]したがって、関数を次のように変更しますint

int function1(char word_array[WORDS][LENGTH])

WORDSファイルに含まれる単語数が少ない可能性に対処するには、いつfscanf失敗し、失敗したときにループから抜け出す必要があります。

if( 1 != fscanf(wordsfile, "%17s", word_array[i]) ) break;

残りの 17 文字を超える単語を無視するには、空白文字またはEOF.

int c;
do { c = fgetc(wordsFile); } while( c != EOF && !isspace(c) );

すべてを一緒に入れて:

int function1(char word_array[WORDS][LENGTH])
{
    FILE *wordsfile = fopen("words.dat", "r");
    int c, i = 0;

    if (wordsfile == NULL)
    {
        printf("\nwords.dat was not properly opened.\n");
    }
    else
    {
        for (i = 0; i < WORDS; i++)
        {
            if( 1 != fscanf(wordsfile, "%17s", word_array[i]) ) break;

            /* eat remaining characters of long words */
            do { c = fgetc(wordsFile); } while( c != EOF && !isspace(c) );
        }
        fclose(wordsfile);
    }

    /* Return the number of words read */
    return i;
}
于 2013-11-11T21:52:55.783 に答える