嗨,我对编码很陌生。所以我的老师在标题中提到了这项任务。这就是我到目前为止所做的:
#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
作为输出。我无法弄清问题是什么,所以感谢任何帮助。问候。
答案 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-325987789234
或21[2] 31941 segmentation fault (core dumped) ./a.out
。
您的计划需要3次修复:
main
返回int
reverse
返回void
并事先声明。printf
反向返回值。因此我们得到了
#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的情况下。