関数を使用して不明な数の入力を読み取ろうとしていscanf
ます。
int a[100];
int i = 0;
while((scanf("%d", &a[i])) != '\n')
i++;
// Next part of the code
しかし、この関数はコードの次の部分には行きません。無限のwhileループがあるようです。
この論理エラーを解決するにはどうすればよいですか?整数を配列に読み込むのがscanf
好きな他の選択肢はありますか?sscanf
関数を使用して不明な数の入力を読み取ろうとしていscanf
ます。
int a[100];
int i = 0;
while((scanf("%d", &a[i])) != '\n')
i++;
// Next part of the code
しかし、この関数はコードの次の部分には行きません。無限のwhileループがあるようです。
この論理エラーを解決するにはどうすればよいですか?整数を配列に読み込むのがscanf
好きな他の選択肢はありますか?sscanf
scanf
正常に照合および割り当てられた入力項目の数を返すため、次のようにするのが妥当です。
while(scanf(...) == 1)
ここで、それぞれが新しい行で定義されている複数の数値を読み取れるようにする必要があります。次に、これを簡単に行うことができます。
int array[100];
int i = 0;
while(i < 100 && scanf("%d\n", &array[i]) == 1)
i++;
この読み取りは、無効な入力(文字などq
)が入力された場合、または入力終了制御コード( Ctrl+ Z(Windowsの場合)またはCtrl+ D(Mac、Linux、Unixの場合))を入力した場合にのみ停止することに注意してください。
scanfの戻り値は、正常に一致および割り当てられた入力項目の数であるため、数値以外の入力が検出されたときにこれを終了してみてください。
while (i < 100 && (scanf("%d", &a[i])) == 1) { i++; }
あなたがしたい
char discard;
while(i < 100 && (scanf("%d%1[^\n]s", &arr[i], &discard)) == 2)
i++;
新しい行まで入力を取得し続けるため。
scanf()は、行全体を読み取るための最適なツールではありません。fgets()を使用して行を読み取り、sscanf()または他の関数を使用して解析する必要があります。
scanfの戻り値は、呼び出しごとにスキャンされた入力の数です。これを整数10(または'\ n')と比較できます。これにより、scanfが実際に10個のアイテムを読み取ったときにループが停止します。(これを行うには、フォーマット文字列に10個の指定子が必要です。
あなたが試すことができます
while((i<10) && (scanf("%d",a+i)==1)) i++;
任意の数の引数を受け入れるようにプログラムする必要があります。なので
while (fgets(mybuf, ALLOCATED_LENGTH-1, stdin)) {
char *p = mybuf;
if (*p=='\n') break; // or a better function to test for empty line
while (custom_scan_next_integer(&p)) i++;
}
ここでcustom_scan_next_integer
、ポインタpを変更して、適切な量の文字を転送します。
最初にこれに置き換えると、改行の問題が回避"%d"
されます" %d"
次に、入力に数値以外の入力が含まれている場合、whileループは無限ループに入ります。したがって、入力が数値入力であるかどうかを確認する必要があります
主な問題は、入力からいくつの数字を読むべきかわからないことだと思います。他の場所からこの回答を見つけました。これは私のものではありませんが、すばらしいトリックです。
#include <stdio.h>
#include <stdlib.h>
int main() {
int i=0, j=0;
int arr[10000];
char temp;
do {
scanf("%d%c", &arr[i], &temp);
i++;
} while(temp != '\n');
for(j=0; j<i; j++) {
printf("%d ", arr[j]);
}
return 0;
}
このコードはAbhishekBhattacharya(Quoraから)に属しています(最初の回答)