C程序中的意外输出

时间:2013-08-09 13:34:39

标签: c

#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 个答案:

答案 0 :(得分:5)

printf语句被调用太多次了。如果您没有读取数据,则需要停止执行。因为无论如何你都在使用递归,所以你不需要循环:

if( scanf("%d",&n) != 1) return;
koaneeye();

答案 1 :(得分: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)将为false(我猜这不是一个数字)。因此n保持不变,但n具有随机值!所以while(n)可能是真的,这就是为什么你有这个奇怪的价值。

答案 2 :(得分: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)
...

答案 3 :(得分:0)

更改

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

if( scanf("%d",&n) == 1)
    koaneeye();
else
  while(n)
  {}