2

次のように始まる非常に単純なコードがあるとします。

#include <stdio.h>
int main() {
    char c;
    int x;

    printf("Num here: ");
    c = getchar();
    x = 0;

    while (c!=EOF) {
        x = c - 48; //to convert x from ASCII

このプログラムでは、ユーザーに数字 (例: 42) を入力させ、1 桁を 10 桁 (および 100 桁など) に追加しようとしています。番号の最後までループに戻る while ループを取得する方法を理解するのに苦労しています。

そのため、文字の終わりまでループを読み取らせ、ユーザーが入力した char 入力を数値 (42) として読み取り、getchar( )。

4

4 に答える 4

8

通常、次を使用します。

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掛けることができます。102010*2030

車輪の中の車輪 — またはループの中のループ。基準を少し指定する必要があります。ユーザーが入力した場合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();

どちらも正常な入力で問題なく動作します。空行は入力の終わりとして扱われます。空白を含む行はそうではありません。1a2b3c2 番目の条件で入力すると、出力が得られます0。最初のものでは、無限ループが発生します。オーバーフロー保護はありません。階乗 20 を実行して正しい答えを期待しないでください (32 ビットを使用int)。心ゆくまで微調整してください。

于 2013-09-04T05:28:43.173 に答える
1

あなたのコード:

#include <stdio.h> 
#include<ctype.h>
int main() {
    int c;//getchar() returns integer
    int x;

    printf("Num here: ");

    x=0;    
    //As @Jonathan Leffler  suggested ,  
    //usage of while loop like this is very helpful the moment you press Enter loop breaks.  

    while (isdigit(c = getchar())) //isdigit is a function from ctype.h checks for Entered character is digit or not
        x = x*10 + c - 48; //here '0'==48   
    printf("%d",x);  
    }

42に入ると

loop rotates two times for c==4 and c==2
c==4 
x=0*10+'4'-48 //here '4'==52 ==>  x=0+52-48  ==>x=4
c==2
x=4*10+'2'-48 //here '2'==50 ==> x=40+50-48 ==>x=42  

1 桁を 10 桁、次に 100 桁に追加するには ... 入力番号に桁を追加する場合は、while ループの下でこれを使用します

int sum=0,num;
//read num
while(num>0)
{
sum=sum+num%10; //get the last digit and add to sum
num=num/10; //reduce last digit of num
}  
于 2013-09-04T05:27:17.643 に答える
0

問題を解決する必要があると私たちが考える方法は、すべての言語機能を考慮すると、別の方法で解決できる場合があります。

#include <stdio.h>
int main() {
    int x;

    printf("Num here: ");
    scanf("%d", x);

}

プログラムと同じ機能を実装します。

于 2013-09-04T05:46:17.460 に答える