1

gcc 4.4.4 c89

次のコードを使用して、fgetsを使用してファイルを読み込みます。MまたはFのいずれかの性別を取得したいだけです。

ただし、性別は常に文字列の最後の文字であるため。strlenを使えばキャラクターが手に入ると思いました。ただし、何らかの理由で、strlenとマイナス2を取得する必要があります。strlenにヌルが含まれていないことはわかっています。ただし、キャリッジリターンは含まれます。

私が読んでいるテキストの正確な行はこれです:

"Low, Lisa" 35 F

私のコード:

int read_char(FILE *fp)
{
#define STRING_SIZE 30
    char temp[STRING_SIZE] = {0};
    int len = 0;

    fgets(temp, STRING_SIZE, fp);

    if(temp == NULL) {
        fprintf(stderr, "Text file corrupted\n");
        return FALSE;
    }

    len = strlen(temp);
    return temp[len - 2];
}

strlenは、16を返す必要があると感じたときに17を返します。キャリッジリターンを含む文字列の長さ。-2ではなく-1を実行する必要があると感じています。

あなたが私の質問を理解するならば、どんな提案でも。

ありがとう、

編集:

fgets() reads in at most one less than size characters from stream and stores them into the buffer pointed to  by  s.   Reading  stops
       after  an  EOF  or  a  newline.  If a newline is read, it is stored into the buffer.  A '\0' is stored after the last character in the
       buffer

したがって、バッファには次のものが含まれます。

"Low, Lisa" 35 F\0\r

\ rが含まれている場合、strlenから17を返すのはどれですか?私はそれを考えるのは正しいですか?

4

4 に答える 4

3

バッファーには以下が含まれます。

"Low, Lisa" 35 F\n\0

したがって、-2 が正しいです。strlen - 0 はヌル ターミネータ、-1 は改行、-2 は文字 F です。

また、

if(temp == NULL) {

temp は配列です。NULL にすることはできません。

于 2010-07-31T10:35:05.020 に答える
1

それ以外の

if (temp == NULL) 

代わりに fgets からの戻り値を確認してください。null の場合は失敗を示します

if ( fgets(temp, STRING_SIZE, fp) == NULL )

はい、strlen には改行が含まれます

ファイルの最後の行にいて、その行の最後に \n がない場合、文字列に常に \n があると仮定すると問題が発生することに注意してください。

別の方法は、文字列を同じように読み取ることですが、最後の文字を確認します。\n がない場合は、-2 オフセットではなく -1 を使用する必要があります。

于 2010-07-31T10:57:20.227 に答える
1

ファイルの保存に使用するオペレーティング システムによって異なります。

  • Windows の場合、キャリッジ リターンは \r\n
  • Linux の場合、\n
于 2010-07-31T10:17:12.850 に答える
1

デバッグして、Len に正確に来るものを見つけましたか。c で実行している場合は、watch を追加して、値 len に表示されているものを見つけます。

于 2010-07-31T10:20:15.447 に答える