C语言中递归函数的错误输出

C语言中递归函数的错误输出,c,visual-studio-2012,recursion,C,Visual Studio 2012,Recursion,我应该制作一个递归函数,使用putchar()而不是printf逐位打印一个整数。输出应该是1234,但我得到的是1234(笑脸)1234。为什么会这样 另外,能否在printf之外添加“\n” 非常感谢 #include <stdio.h> int printnumber(); int main() { int n = 1234; printnumber(n); return 0; } int printnumber(int n) { int

我应该制作一个递归函数,使用putchar()而不是printf逐位打印一个整数。输出应该是1234,但我得到的是1234(笑脸)1234。为什么会这样

另外,能否在printf之外添加“\n”

非常感谢

#include <stdio.h>

int printnumber();

int main()
{
    int n = 1234;
    printnumber(n);
    return 0; 
}

int printnumber(int n) {
    int x, y;
    x = flip(n) % 10;
    putchar(x);
    y = flip(n) / 10;
    if (y < 0)
        printnumber(y);
}

int flip(int n)
{
    if (n < 0) {
        putchar('-');
        n = -n;
    }
    if (n / 10)
        flip(n / 10);
    putchar(n % 10 + '0');
}
#包括
int printnumber();
int main()
{
int n=1234;
打印号码(n);
返回0;
}
整数打印编号(整数n){
int x,y;
x=翻转(n)%10;
putchar(x);
y=翻转(n)/10;
if(y<0)
打印号码(y);
}
整数翻转(整数n)
{
if(n<0){
putchar('-');
n=-n;
}
若有(n/10)
翻转(n/10);
putchar(n%10+'0');
}

您的代码具有未定义的行为,因为函数flip声明为具有返回类型
int
实际上不返回任何内容

此外,函数翻转似乎完成了所有工作。所以现在还不清楚printnumber函数的意义是什么

您可以用以下方法简单地定义函数

#include <stdio.h>

void print_number( int n )
{
    if ( n < 0 ) 
    {
        putchar('-');
        n = -n;
    }

    if ( n / 10 ) print_number( n / 10 );
    putchar( n % 10 + '0' );
}

int main(void) 
{
    print_number( -1234 );


    return 0;
}

代码具有未定义的行为,因为函数flip声明为具有返回类型
int
实际上不返回任何内容

此外,函数翻转似乎完成了所有工作。所以现在还不清楚printnumber函数的意义是什么

您可以用以下方法简单地定义函数

#include <stdio.h>

void print_number( int n )
{
    if ( n < 0 ) 
    {
        putchar('-');
        n = -n;
    }

    if ( n / 10 ) print_number( n / 10 );
    putchar( n % 10 + '0' );
}

int main(void) 
{
    print_number( -1234 );


    return 0;
}

假设这是你打算做的。在使用递归函数时,递归函数调用后的行被推送到堆栈上,因此我们可以使用它并打印1234,如下所示

#include <stdio.h>

void printnumber();

int main()
{
    int n = 1234;
    printnumber(n);
    return 0; 
}

void printnumber(int n) {
    char ch;
    int x;
    if(n == 0)
    return;
    else
    {
       x = n % 10;
       n = n/10;
       ch = x + '0';
       printnumber(n);
       putchar(ch);
    }
}
#包括
void printnumber();
int main()
{
int n=1234;
打印号码(n);
返回0;
}
无效打印编号(整数n){
char ch;
int x;
如果(n==0)
回来
其他的
{
x=n%10;
n=n/10;
ch=x+‘0’;
打印号码(n);
putchar(ch);
}
}

假设这是您打算做的。在使用递归函数时,递归函数调用后的行被推送到堆栈上,因此我们可以使用它并打印1234,如下所示

#include <stdio.h>

void printnumber();

int main()
{
    int n = 1234;
    printnumber(n);
    return 0; 
}

void printnumber(int n) {
    char ch;
    int x;
    if(n == 0)
    return;
    else
    {
       x = n % 10;
       n = n/10;
       ch = x + '0';
       printnumber(n);
       putchar(ch);
    }
}
#包括
void printnumber();
int main()
{
int n=1234;
打印号码(n);
返回0;
}
无效打印编号(整数n){
char ch;
int x;
如果(n==0)
回来
其他的
{
x=n%10;
n=n/10;
ch=x+‘0’;
打印号码(n);
putchar(ch);
}
}
在您的代码中

x = flip(n) % 10;
行调用未定义的行为

您没有从
int flip(int n)
返回任何值。因此,在执行上述步骤时,编译器将没有来自
flip(n)
调用的显式返回值,因此,结果是未定义的

相关阅读:摘自
C99
规范文件第6.9.1章第12段

如果到达终止函数的},并且函数调用的值由 调用方的行为未定义

注意:考虑一个更简单的逻辑。这对于打印数字来说有点过分了。

在您的代码中

x = flip(n) % 10;
行调用未定义的行为

您没有从
int flip(int n)
返回任何值。因此,在执行上述步骤时,编译器将没有来自
flip(n)
调用的显式返回值,因此,结果是未定义的

相关阅读:摘自
C99
规范文件第6.9.1章第12段

如果到达终止函数的},并且函数调用的值由 调用方的行为未定义

注意:考虑一个更简单的逻辑。这对于打印数字有点过分。

是否需要flip()函数?你可以检查这个

#include <stdio.h>

void printnumber(int n);

int main()
{
    int n = -1234;
    printnumber(n);
    return 0;
}

void printnumber(int n) {
    if(n/10==0)
    {
        if(n<0)
        {
            putchar('-');
            n=-n;
        }
        putchar(n+'0');
        return;
    }
    int x, y;
    x=n%10;
    if(x<0)
    x=-x;
    printnumber(n/10);
    putchar(x+'0');
}
#包括
无效打印编号(int n);
int main()
{
int n=-1234;
打印号码(n);
返回0;
}
无效打印编号(整数n){
如果(n/10==0)
{
如果(n是否需要flip()函数?您可以检查这个

#include <stdio.h>

void printnumber(int n);

int main()
{
    int n = -1234;
    printnumber(n);
    return 0;
}

void printnumber(int n) {
    if(n/10==0)
    {
        if(n<0)
        {
            putchar('-');
            n=-n;
        }
        putchar(n+'0');
        return;
    }
    int x, y;
    x=n%10;
    if(x<0)
    x=-x;
    printnumber(n/10);
    putchar(x+'0');
}
#包括
无效打印编号(int n);
int main()
{
int n=-1234;
打印号码(n);
返回0;
}
无效打印编号(整数n){
如果(n/10==0)
{
如果(n我假设您想要:

  • 接受int并显示它的函数
  • 调用递归函数逐位打印
  • display在数字后添加新行(
    \n
但由于您的函数不返回任何感兴趣的内容,因此最好将其声明为无效。这样可以避免在没有任何返回的情况下使用函数值的未定义行为(
x=flip(n)%10;
in printnumber)

例如,您可以执行以下操作:

#include <stdio.h>

/* function declaration before usage */
void flip(int n);
void printnumber(int n)

int main()
{
    int n = 1234;
    printnumber(n);
    return 0; 
}

/* prints a int followed by new line */
void printnumber(int n) {
    if (n < 0) {
        putchar('-');
        n = -n;
    }
    flip(n);
    putchar('\n');
}

/* recursively prints decimal digits of an int */
void flip(int n)
{
    if (n / 10)
        flip(n / 10);
    putchar(n % 10 + '0');
}
#包括
/*使用前的函数声明*/
无效翻转(int n);
无效打印编号(整数n)
int main()
{
int n=1234;
打印号码(n);
返回0;
}
/*打印一个整数,后跟新行*/
无效打印编号(整数n){
if(n<0){
putchar('-');
n=-n;
}
翻转(n);
putchar('\n');
}
/*递归打印整数的十进制数字*/
无效翻转(整数n)
{
若有(n/10)
翻转(n/10);
putchar(n%10+'0');
}
按注释编辑:如果您只需要一个函数,您最好在main中输入只应发生一次的内容:

#include <stdio.h>

/* function declaration before usage */
void printnumber(int n)

int main()
{
    int n = 1234;
    if (n < 0) {
        putchar('-');
        n = -n;
    }
    printnumber(n);
    putchar('\n');
    return 0; 
}

/* recursively prints decimal digits of an int */
void printnumber(int n)
{
    if (n / 10)
        printnumber(n / 10);
    putchar(n % 10 + '0');
}
#包括
/*使用前的函数声明*/
无效打印编号(整数n)
int main()
{
int n=1234;
if(n<0){
putchar('-');
n=-n;
}
打印号码(n);
putchar('\n');
返回0;
}
/*递归打印整数的十进制数字*/
无效打印编号(整数n)
{
若有(n/10)
印刷号码(n/10);
putchar(n%10+'0');
}
我想您需要:

  • 接受int并显示它的函数
  • 调用递归函数逐位打印
  • display在数字后添加新行(
    \n
但是,由于您的函数不返回任何感兴趣的内容,因此最好将它们声明为无效
#include <limits.h>
#include <stdio.h>

static void printdigit(int n) {
  if (n <= -10) {
    printdigit(n / 10);
  }
  putchar('0' - n % 10);  // use -
}

void printnumber(int n) {
  if (n < 0) {
    putchar('-');
  } else {
    n = -n;
  }
  printdigit(n);
  putchar('\n');
}
int main(void) {
  printnumber(1234);
  printnumber(-1234);
  printnumber(INT_MIN);
  printnumber(INT_MAX);
  printnumber(0);
  return 0;
}
1234
-1234
-2147483648
2147483647
0