4

次のような入力が与えられた場合:

6 2
1 2 3 4 5 6
4 3 3 4 5 6 

最初の行の最初の数字は行の変数の数、2 番目の数字は行の数です。n/2最初の値のみを取得nして、行の値の数を次の行にスキップするにはどうすればよいですか?

4

3 に答える 3

4

入力の長さが変わらない場合 (たとえば、例のように 6 つの数字)、次を使用して目的の入力を読み取ることができます。

scanf("%d %d %d", ...);

次に、残りの入力を破棄します。

while ((ch = getchar()) != '\n' && ch != EOF);

入力の長さ異なる場合は、バッファに読み込む必要があります。次に、文字列を反復処理してその中のスペースの数を見つけ (つまり、n = スペース + 1)、strtokn/2 回繰り返して最初の n/2 の数値を取得します。

于 2012-11-22T18:30:15.907 に答える
3

誰も言及していないことに驚いていますfscanf("%*d")-その*記号はfscanf整数値を読み取るように指示しますが、それを無視するように指示します(ドキュメントhereを参照)。これにより、次のようなことができます。

int numbers[MAX_NUMS];
int n = numbers_in_line();
for( i = 0; i < n; i++ )
   if(i<n/2)
      fscanf("%d", &numbers[i]);
   else
      fscanf("%*d");

これは、残りの文字を読み取るよりも明確に見えます。事前に知っていればn、次のように書くこともできます。

scanf("%d %d %d %*d %*d %*d",&numbers[0],&numbers[1],&numbers[2]);

これについては直接質問しませんでしたが、バイナリ データを読み込んでいる場合は、行の残りをスキップする別の方法があります。必要なデータを読み取ってから、次の行の開始位置を計算し (ここではポインター演算)、fseek関数を使用してその位置にジャンプすると、I/O 時間を節約できます。残念ながら、ASCII データではこれを行うことはできません。これは、数値が一定量のスペースを占有しないためです。

于 2012-11-22T18:56:41.343 に答える
0

前に、一列にいくつの数字があるか知っていますか? あなたの答えが「はい」の場合、これを試すことをお勧めします。

int n = numbersInALine(); 
int i = 0;
int *numbers = (int*) malloc( sizeof( int ) * ( n / 2 ) );
for( i = 0; i < n/2; i++ )
    scanf( "%d", &numbers[i] );
于 2012-11-22T18:26:30.353 に答える