2

ここではCの真新しい。このプログラムは、前後に「#」で区切られた 1 行のフラグメントのファイルを読み込むことになっています。例 #fragment1##fragment2##fragment3#

チェックしたい 2 つのエラーは、フラグメントが 1000 文字を超えていないことと、ファイルがフラグメントの両側で正しい形式の「#」に従っていることです。fscanf 構文がどのように機能するかはよくわかりませんが、次のようにしてエラーをチェックすると思います。

  char buffer[MAX_FRAG_LEN+1];
  if (fscanf(fp, "#%1000[^#]#", buffer) == 1) {
    return strdup(buffer);
  } else {
    fprintf(stderr, "Error! Incorrect format.\n");
  }

ただし、2 つのエラーのどちらであったかを具体的に伝えることができるように、エラーを分離したいと考えています。個別にチェックするにはどうすればよいですか?とても有難い!

4

1 に答える 1

1

テクニックを機能させるには、バッファの後の次の文字がリターンの後かどうかを手動で確認する必要があり'#'ますfscanf。これにより、文字列が長すぎるエラーと欠落しているエラーを区別できます"##"

  char buffer[MAX_FRAG_LEN+1];
  if (fscanf(fp, "#%1000[^#]", buffer) == 1) {
    int c = fgetc(fp);
    if (c == '#') return strdup(buffer);
    if (c != EOF) {
      ungetc(c, fp);
      fprintf(stderr, "Error! More than 1000 characters.\n");
    } else {
      fprintf(stderr, "Error! Last fragment did not end with '#'.\n");
    }
  } else {
    fprintf(stderr, "Error! Fragment did not start with '#'.\n");
  }

ただし、fscanf解析に使用するのは一般的に注意が必要です。入力がまったく予期しない形式である場合、それらから正しく回復するのが難しい場合があります。そのため、Duck が示唆するように、1 つのバッファーで行全体を読み取り、代わりにその行を解析することで、通常はエラーを処理する方が簡単です。

于 2012-07-10T01:24:44.053 に答える