使用c中的函数以相反顺序打印数字

时间:2016-03-10 16:52:33

标签: c

嗨,我对编码很陌生。所以我的老师在标题中提到了这项任务。这就是我到目前为止所做的:

#include <stdio.h>

void main() {
    int n;
    printf("Enter n: ");
    scanf("%d", &n);
    printf("%d in reverse order is ", n);
    printf("%d", reverse(n));
}

int reverse(int n) {
    int r;

    do {
        r = n % 10;
        printf("%d", r);
        n = n / 10;
    } while (n > 0);
}

问题是,当我输入一个数字时,它会以相反的顺序打印,但最后会有一个0。例如,如果我提供12,则会将210作为输出。我无法弄清问题是什么,所以感谢任何帮助。问候。

2 个答案:

答案 0 :(得分:2)

您没有在启用警告的情况下编译程序,这就是它具有未定义行为的原因。始终编​​译并启用警告并将警告设置为错误:

% gcc test.c -Wall -Werror
test.c:3:6: error: return type of ‘main’ is not ‘int’ [-Werror=main]
 void main() {
      ^
test.c: In function ‘main’:
test.c:8:18: error: implicit declaration of function ‘reverse’ 
     [-Werror=implicit-function-declaration]
     printf("%d", reverse(n));
                  ^
test.c: In function ‘reverse’:
test.c:19:1: error: control reaches end of non-void function [-Werror=return-type]
 }
 ^
cc1: all warnings being treated as errors

为什么您最后看到0未定义的int reverse()打印出来的值。

由于未从声明为返回int的函数返回值是未定义的行为,因此输出也可能是21-32598778923421[2] 31941 segmentation fault (core dumped) ./a.out

您的计划需要3次修复:

  1. main返回int
  2. reverse返回void并事先声明。
  3. 不要尝试printf反向返回值。
  4. 因此我们得到了

    #include <stdio.h>
    
    void reverse(int);
    int main() {
        int n;
        printf("Enter n: ");
        scanf("%d", &n);
        printf("%d in reverse order is ", n);
        reverse(n);
        printf("\n");
    }
    
    void reverse (int n) {
        int r;
        do {
            r = n % 10;
            printf("%d", r);
            n = n / 10;
        } while(n > 0);
    }
    

    如果您想要返回n数字后面的数字,那么您可能不应该在reverse中打印任何内容。

答案 1 :(得分:0)

程序有不确定的行为。

这是因为您尝试打印reverse()函数的返回值,该函数声明为int,但您的函数不返回任何内容。

更正此问题,然后仅在函数reverse()内打印值,并可选择单独使用reverse()函数的返回值。

int
reverse (int n)
{
    int r;

    do
    {
        r = n % 10;
        printf("%d", r);
        n = n / 10;
    } while(n > 0);
    return 0;
}

printf("%d in reverse order is ", n);
reverse(n);

请注意:此函数不会按预期方式打印负整数的数字,因为余数运算符%的结果与被除数的符号相同,因此在-12 you will print -2的情况下。