2016-08-27 25 views
-2

私のコードの問題は私のfgetsにあると思いますが、修正方法はわかりません。したがって、初めて関数を呼び出すとすべてが機能しますが、2回目には関数はprintfの後のすべてをスキップします。2回目に呼び出されたときにスキップするfgets

ので、出力は次のようになります。

Output: 
Please enter x and y coordinates separated by a comma for the piece you wish to enter: 3,4 
x: 3, y:4 
Please enter x and y coordinates separated by a comma for the piece you wish to enter: x: 
, y: 

これはコードです:

void functioncall() 
{ 
    char coord[4]; 
    printf("Please enter x and y coordinates separated by a comma for the piece you wish to place: "); 
    fgets(coord, 4, stdin); 

    char *xcoord = strtok(coord, ","); 
    char *ycoord = strtok(NULL, " "); 
    if (!ycoord) 
    { 
     ycoord = ""; 
    } 

    printf("x: %s, y: %s\n", xcoord, ycoord); 
} 

私はそれが二度目に呼ばれた入力を与えることはできません。

+2

あなたの文字列は小さすぎるので、改行に合わせることができないので、次の 'fgets()'は改行だけを取得します。 4を4096に変更してください! –

+0

@JonathanLeffler前にもっと大きな数字を入れようとしましたが、それは仕事をします – PPasf

+1

どうしたらうまくいかなかったのですか?また、 'fgets()'がEOFを報告する方法であるため、null以外のポインタを返すことを確認する必要があります。誰かが '23,45'を入力すると、問題があることに注意してください。または「-1、+ 1」である。 –

答えて

1

表示される動作の理由は、coordアレイのサイズです。サイズを4と指定すると、1桁、1カンマ、1桁、および1ヌルバイトが格納されていることを意味します。これは改行のためのスペースを残さないため、関数の2番目の呼び出しで改行が読み取られます)、これはうまく解析されません。

さらに多くのスペースを許可する必要があります。ユーザーは、入力する内容(先頭の空白、末尾の空白、中間の空白、記号、先行ゼロなど)で無限に発明的です。私は4096を1行の入力に使用する傾向があります。部分的にはショックの価値があります。また、4ページのエッセイを1行に書き込もうとしても、得られる価値があるからです。

このコードは、私の作品:

例の実行(プログラム名cd19、ソースファイルcd19.c):

$ ./cd19 
Please enter x and y coordinates separated by a comma for the piece you wish to place: 234 , 495 
x: [234] y: [495] 
Please enter x and y coordinates separated by a comma for the piece you wish to place: 1,2 
x: [1] y: [2] 
$ 

区切り文字の選択は234 , 495例がOK動作することが保証されます(タブはオプションですが、必ずしも悪い考えではありません)。ただし、ユーザーがカンマを入力する必要はありません。

関連する問題