通常、次を使用します。
int c; // Because getchar() returns an int, not a char
int x = 0;
while ((c = getchar()) != EOF)
{
if (isdigit(c))
x = x * 10 + (c - '0');
else
...
}
これは、ループの先頭に到達するたびに文字を読み取ります。ループの最後で中かっこを実行することによって (または、場合によっては、continue
ステートメントを使用することによって) ループを元に戻すことができます。break
たとえば、数値の一部にならない文字を読み取った場合は、 でループを終了できます。
ユーザーが入力した場合42
(その後にEnter)、最初に読み取りc == '4'
、次にc == '2'
newline を読み取ります'\n'
。'0'
からまでのすべての桁について、'9'
そのdigit - '0'
桁に対応する数値が得られます。改行を数値の一部にすることはできないため、改行をungetc(c, stdin)
読み取ったときに元に戻すか、ループを中断します。
ユーザーが 43219876543 と入力した場合は、オーバーフローに注意してください。期待したのint
は 42 だけです (32 ビット量です)。
ループ条件は次のように記述できます。
while ((c = getchar()) != EOF && isdigit(c))
あるいは:
while (isdigit(c = getchar()))
後者を実際に製品コードに入れることは非常に気が進まないでしょうが、理論的には安全です。
後で数字全体を使用できるように、各数字を個別に扱うにはどうすればよいですか? ユーザーがを入力すると、 を掛けてから ( ) を?で10 20 30
掛けることができます。10
20
10*20
30
車輪の中の車輪 — またはループの中のループ。基準を少し指定する必要があります。ユーザーが入力した場合1
、答えが必要です1
。彼らがタイプするなら1 2
、あなたはしたいです2
。彼らがタイプするなら1 2 3
、あなたはしたいです6
。など (これらは入力の 1 行のすべての数値です)。空白とタブをスキップし、内側のループを使用して数値を読み取り、現在の積 (初期値1
) を新しい数値で乗算する外側のループが必要です。外側のループの後に、製品。これは1
空行として出力されます。多分それは問題ではありません(そして多分それは問題です)。
適切なものを概算するコードを次に示します。
#include <ctype.h>
#include <stdio.h>
int main(void)
{
int c;
while ((c = getchar()) != EOF && c != '\n')
{
int product = 1;
while (c != EOF && c != '\n')
{
while (isspace(c))
c = getchar();
int number = 0;
while (isdigit(c))
{
number = number * 10 + (c - '0');
c = getchar();
}
printf("Number: %d\n", number);
product *= number;
}
printf("Product: %d\n", product);
}
return 0;
}
また、「スキップ」ループが少し異なるバージョンも試しました。
while (c != EOF && c != '\n' && !isdigit(c))
c = getchar();
どちらも正常な入力で問題なく動作します。空行は入力の終わりとして扱われます。空白を含む行はそうではありません。1a2b3c
2 番目の条件で入力すると、出力が得られます0
。最初のものでは、無限ループが発生します。オーバーフロー保護はありません。階乗 20 を実行して正しい答えを期待しないでください (32 ビットを使用int
)。心ゆくまで微調整してください。