0
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

void koaneeye(){
    static int j=0;
    int n,i=0,rev=0;
    while( scanf("%d",&n) == 1)
        koaneeye();
    while(n)
    {
        i=n%10;
        rev=rev*10+i;
        n=n/10;
    }
    printf("%d\n",rev);
}

int main() {

    koaneeye();

    return 0;
}

上記プログラムの場合

入力: 123 223 323 423 523 623

出力: 325767891 326 325 324 323 322 321

なぜその余分な番号が来るのですか?

4

4 に答える 4

5

printf ステートメントの呼び出し回数が多すぎます。データを読み取らなかった場合は、実行を停止する必要があります。とにかく再帰を使用しているため、ループする必要はありません。

if( scanf("%d",&n) != 1) return;
koaneeye();
于 2013-08-09T13:41:16.000 に答える
2
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

void koaneeye(){
    static int j=0;
    int n = 0, i=0, rev=0; // HERE
    int ret = 0;
    while((ret = scanf("%d",&n)) == 1)
        koaneeye();
    if (ret != 1)
        return ;
    while(n)
    {
        i=n%10;
        rev=rev*10+i;
        n=n/10;
    }
    printf("%d\n",rev);
}

int main() {

    koaneeye();

    return 0;
}

これでOKです!を初期化する必要がありますn。なぜなら: while( scanf("%d",&n) == 1)は最後の入力に対して false になるからです (これは私が推測する数字ではありません)。Sonは変更されていませんが、n値はランダムです ! それが本当かもしれません、そしてそれがあなたwhile(n)がこの奇妙な値を持っている理由です.

于 2013-08-09T13:39:18.123 に答える
1

最も内側の呼び出しが無効な入力で終了しました。

これを検出した場合、koaneeye()再度の呼び出しは控えますが、それでもそのデータの処理は続行します。

if同様に、反復は「自己反復」であるため、ここではan で十分だと思います。

だからあなたはすべきです

if (scanf("%d",&n) == 1) {
    // Succeeded in reading a value - call next before us.
    koaneeye();
} else {
    return; // refrain from processing bogus input from above.
}

while(n)
...
于 2013-08-09T13:41:51.547 に答える