5

関数を使用して不明な数の入力を読み取ろうとしていscanfます。

int a[100];
int i = 0;

while((scanf("%d", &a[i])) != '\n')
 i++;

// Next part of the code

しかし、この関数はコードの次の部分には行きません。無限のwhileループがあるようです。

この論理エラーを解決するにはどうすればよいですか?整数を配列に読み込むのがscanf好きな他の選択肢はありますか?sscanf

4

6 に答える 6

8

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の場合))を入力した場合にのみ停止することに注意してください。

于 2013-03-08T10:26:39.813 に答える
2

scanfの戻り値は、正常に一致および割り当てられた入力項目の数であるため、数値以外の入力が検出されたときにこれを終了してみてください。

while (i < 100 && (scanf("%d", &a[i])) == 1) { i++; }
于 2013-03-08T10:20:41.640 に答える
0

あなたがしたい

char discard;

while(i < 100 && (scanf("%d%1[^\n]s", &arr[i], &discard)) == 2)
 i++;

新しい行まで入力を取得し続けるため。

scanf()は、行全体を読み取るための最適なツールではありません。fgets()を使用して行を読み取り、sscanf()または他の関数を使用して解析する必要があります。

于 2013-03-08T10:20:02.430 に答える
0

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を変更して、適切な量の文字を転送します。

于 2013-03-08T10:20:25.693 に答える
0

最初にこれに置き換えると、改行の問題が回避"%d"されます" %d"

次に、入力に数値以外の入力が含まれている場合、whileループは無限ループに入ります。したがって、入力が数値入力であるかどうかを確認する必要があります

于 2013-03-08T10:20:58.027 に答える
0

主な問題は、入力からいくつの数字を読むべきかわからないことだと思います。他の場所からこの回答を見つけました。これは私のものではありませんが、すばらしいトリックです。

#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から)に属しています(最初の回答)

于 2021-02-26T14:00:15.797 に答える