2016-10-03 18 views
0

これはpatternsearch関数を呼び出す私のa4.c mainメソッド内のループで再び印刷されています最後の呼び出しは、二回patternsearchしますcが関数の最後の呼び出しは

例えば、TEST3のための私の出力を見て:あなたが見ることができるように

Found "tip" at 0 2, L 
Found "pop" at 0 0, D 
Found "pop" at 2 0, U 
Found "key" at 0 3, D 
Found "key" at 2 1, R 
"nope" - Not Found 
"nope" - Not Found 

、「ハズレ」のテスト結果は、二回印刷しました。 :(

私は私の問題は、ここで述べたものと類似していると思う: Last line being printed twice (C++) が、私はよく分からない入力を含むすべての問題と

答えて

0

ここでの問題は、私が実際にEOF文字を打ったときはfeof()が唯一の真の返したことでした。
これは、私がscanf()を呼び出していて、EOFを打っていたことを意味します。 これはループが再び繰り返されないことを意味しますが、私はすでにその中間にいました。
しかし、scanf()は実際に引数を変更するだけです。 それが失敗したため(EOFを打つことによって)、 は文字配列を変更しません。文字配列には前の単語(つまり前の単語)の内容はそのまま残ります。

私はscanf()の戻り値をチェックしました。戻り値。新しい値を入れる引数の数。 それが1より小さい場合、実際には新しい文字列を取得しませんでした(EOFはファイルの終わりに達した場合に明示的にEOFを返します; EOFはほとんどのプラットフォームで-1と等しい#defineされた定数ですが、とにかく<チェックが機能します)。

これが最終的に働いていたコードです:

while(!feof(stdin)) { 
    if (scanf("%s", &word) < 1) 
     break; 
    patternSearch(grid, word); 
    } 
1

ステップ1:テスト入力機能からの戻り値を将来の読み取りについて。読み取りがファイルの終わりが生じた

  1. feof()かどうかをチェックする。それは報告されません。

  2. 予期しない結果がコードscanf("%s", &word);で発生していますが、コードでは戻り値がscanf()であることが確認されていません。弱いコードは戻り値をチェックしません。ロバストなコードです。 scanf()とその戻り値の適切な使用法を調べてください。

  3. "%s"には幅の制限がありません。

  4. &scanf("%s", &word);にする必要はありません。確認するにはword宣言を参照する必要があります。

    char word[100]; 
    while (scanf("%99s", word) == 1) { 
        patternSearch(grid, word); 
    } 
    
関連する問題