次のような入力が与えられた場合:
6 2
1 2 3 4 5 6
4 3 3 4 5 6
最初の行の最初の数字は行の変数の数、2 番目の数字は行の数です。n/2
最初の値のみを取得n
して、行の値の数を次の行にスキップするにはどうすればよいですか?
入力の長さが変わらない場合 (たとえば、例のように 6 つの数字)、次を使用して目的の入力を読み取ることができます。
scanf("%d %d %d", ...);
次に、残りの入力を破棄します。
while ((ch = getchar()) != '\n' && ch != EOF);
入力の長さが異なる場合は、バッファに読み込む必要があります。次に、文字列を反復処理してその中のスペースの数を見つけ (つまり、n = スペース + 1)、strtok
n/2 回繰り返して最初の n/2 の数値を取得します。
誰も言及していないことに驚いています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 データではこれを行うことはできません。これは、数値が一定量のスペースを占有しないためです。
前に、一列にいくつの数字があるか知っていますか? あなたの答えが「はい」の場合、これを試すことをお勧めします。
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] );