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;
}

现在会好的!您必须初始化n,因为: while( scanf("%d",&n) == 1)对于您的最后一个输入(我猜这不是一个数字)将是错误的。所以n没有改变,但n有一个随机值!所以while(n)可能是真的,这就是为什么你有这个奇怪的价值。

于 2013-08-09T13:39:18.123 回答
1

最里面的调用以无效输入终止。

如果您检测到这一点,您将避免koaneeye()再次调用,但您仍会继续处理该数据。

同样,我认为在if这里就足够了,因为迭代是“自我重复的”。

所以你应该做

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 回答
0

改变

while( scanf("%d",&n) == 1)
    koaneeye();

if( scanf("%d",&n) == 1)
    koaneeye();
else
  while(n)
  {}
于 2013-08-09T13:50:04.060 回答