C语言中递归函数的错误输出
我应该制作一个递归函数,使用putchar()而不是printf逐位打印一个整数。输出应该是1234,但我得到的是1234(笑脸)1234。为什么会这样 另外,能否在printf之外添加“\n” 非常感谢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
#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