0

名前、年齢、性別、情報という形式で人に関するデータを取得する簡単なプログラムを書いています。

[名前: , 年齢: , 性別: , 情報: ] のように表示されます。

これまでの私のコードは次のとおりです。

#include <stdio.h>

int main() {
char name[10];
int age;
char gender[2];
char info[50];

while(scanf("%9[^,],%i,%c,%49[^\n]", name, &age, gender, info) == 4) {
    printf("[name: %s, age: %i, gender: %c, info: %s]\n", name, age, gender, info);
}

return 0;

}

そこで、> を使用して出力を別のテキスト ファイルに書き込むことにしました。また、正しく表示されず、] ブラケットが新しい行に表示され、[name: が単独で表示されます。

これは私の入力です:

 eliza,7,F,likes animals
 bob,9,M,fast at running
 sue,6,F,likes painting

出力は次のとおりです。

 [name: eliza, age: 7, gender: J, info: likes animals
 ]
 [name: 
 bob, age: 9, gender: J, info: fast at running
 ]
 [name: 
 sue, age: 6, gender: J, info: likes painting
 ]

誰か助けてくれませんか?このようにデータを出力する理由がわかりません。 strstr() を使用して、変数に改行文字が含まれているかどうかを確認してみました。

4

2 に答える 2

3

2 つの問題があります。まず、これは Windows であると思います (または、少なくともあなたが読んでいるファイルは Windows で作成されたものです)。つまり、行末\r\nだけではないということです。\nファイルをテキストモードで開くことで修正できますが、それは信頼できません。余分な\rものを手動で除外することをお勧めします。

それが、各「情報」フィールドの後に改行を入れるものです。

2 番目の問題は、情報フィールドから を拒否することです。その\nため、後の「名前」フィールドの最初の文字としてまだ存在します。これが、そこに余分な改行がある理由です。それを修正するには、文字列の先頭にスペースを入れるだけですscanf(これにより、すべての空白が飲み込まれます) 。

そして Inspired はあなたの 3 番目の問題を指摘します (私は気づきませんでした)。性別を文字列ではなく文字として扱う必要があります。「正しい」読み方は次のようになります。

char gender; // no need to have an array of characters
scanf( "blah %c blah", &gender );

そして次のように印刷します:

printf( "blah %c blah", gender );
于 2013-06-09T16:58:15.593 に答える
0
#include <stdio.h>

int main(void) {
    char name[10];
    int age;
    char gender;//change
    char info[50];

    while(scanf("%9[^,],%i,%c,%49[^\n]%*c", name, &age, &gender, info) == 4) {
        printf("[name: %s, age: %i, gender: %c, info: %s]\n", name, age, gender, info);
    }

    return 0;
}
于 2013-06-09T17:05:44.887 に答える