c语言-这个递归为什么输出少一位?

问题描述

这个递归为什么输出少一位?
 #include <stdio.h>

void prints(char *p){
    if(*p != '') prints(++p);
    if(*p != '') printf("%c",*p);
}

int main(void){
    char p[] = "hello";
    prints(p);
    printf("n");
    return 0;
}

程序运行结果如下:

F:test>gcc -g -o test.exe test.c

F:test>test.exe
olle

输入结果少了h,不理解为什么,求大神帮忙解释一下,在此跪谢!

解决方案

这样就ok了,因为如果++p在先,下面一行打印的就是当前字符的下一个字符

 void prints(char *p){
    if(*p != '') printf("%c",*p);
    if(*p != '') prints(++p);

}

解决方案二:

 if(*p != '') prints(++p);
->
if(*p != '') prints(p + 1);

解决方案三:

http://codepad.org/ODdLzVco
olleh

解决方案四:

第三行和第四行换一下
#include

void prints(char *p){
if(*p != '') printf("%c",*p);
if(*p != '') prints(++p);
}

int main(void){
char p[] = "hello";
prints(p);
printf("n");
return 0;
}

解决方案五:

++p是先加后操作所以第一个被搞没了

解决方案六:

#if 1
#include

void prints(char *p){
//正续
//if (*p != '') printf("%c", *p);
//if (*p != '') prints(++p);
//反序
if (*p != '') prints(++p);
if (*p != '') printf("%c", *p);
}

int main(void){
char p[] = " hello";
prints(p);
printf("n");
return 0;
}

#endif

你要想通过递归反序输出也是可以的, 只不过要避免一下栈本身的缺陷

时间: 2024-09-14 05:04:28

c语言-这个递归为什么输出少一位?的相关文章

c语言-用C语言的递归输出一个99乘法表,请问怎么实现。不能用循环实现

问题描述 用C语言的递归输出一个99乘法表,请问怎么实现.不能用循环实现 用C语言的递归输出一个99乘法表,请问怎么实现.不能用循环实现,请问怎么做 解决方案 #include <stdio.h> void foo(int acc1, int acc2) { if (acc1 > 9) return; printf("%d * %d = %dt", acc1, acc2, acc1 * acc2); if (acc2 >= acc1) { acc2 = 1; a

C语言的递归输出,会输出重复的打印信息,不知道是不是跟输出流缓冲有关

问题描述 C语言的递归输出,会输出重复的打印信息,不知道是不是跟输出流缓冲有关 我写的单向链表创建和遍历打印的函数输出一些信息,不知道是怎么来的,希望各位大神能给予指点. 代码: #include #include #include #include typedef struct node{ char value; struct node *m_next; }inode; void CreateNodeTree(inode **treenode) { char a; printf("input

c语言-华为C语言面试题目,输出内容的值

问题描述 华为C语言面试题目,输出内容的值 11.写出下列代码的输出内容 #include int inc(int a) { return(++a); } int multi(int*a,int*b,int*c) { return(*c=*a**b); } typedef int(FUNC1)(int in); typedef int(FUNC2) (int*,int*,int*); void show(FUNC2 fun,int arg1, int*arg2) { INCp=&inc; int

c语言中小递归,大神看看哪里出了问题

问题描述 c语言中小递归,大神看看哪里出了问题 include int main (){ int func (int i); int a[5]i; printf (""%d ""func(5)); return 0;} int func (int i){ int a[5]; if (i == 1) a[i] = 10; if (i > 1) a[i] = func[i-1]+2;} 解决方案 #include <stdio.h>int func (

c语言-C语言用递归求圆周率的值,要求精确到小数点后3位,不得使用循环

问题描述 C语言用递归求圆周率的值,要求精确到小数点后3位,不得使用循环 C语言用递归求圆周率的值,要求精确到小数点后3位,不得使用循环 解决方案 http://jingyan.baidu.com/article/bea41d437c69b8b4c51be6e9.html 解决方案二: public class Test { public static void main(String[] args) { System.out.println("怎么插入代码块.."); } }

c语言-C语言整数转字符串输出

问题描述 C语言整数转字符串输出 #include #include void to_str(n)int n;{ char s[10]; int i = 0; if(n { putchar('-'); n = -n; } do { s[i++] = n%10 +'0'; n/=10; } while(n>0); while(i--)putchar(s[i]);}main(){ int xy; scanf(""%d""&x); to_str(x);}这里

c语言-C语言用递归求圆周率的值,怎么实现

问题描述 C语言用递归求圆周率的值,怎么实现 C语言用递归求圆周率的值,要求精确到小数点后3位,不得使用循环 解决方案 C语言实现求圆周率归并排序递归实现C语言

c++-C++用递归方式输出100以内的质数

问题描述 C++用递归方式输出100以内的质数 要求用递归方式求100以内的质数,并且打印出来,每5个一行 解决方案 #include using namespace std; bool isPrime(int i){ for(int j=2;j<=i/2;j++){ if (i%j == 0){ return false; } } return true; } int main(void){ for(int i=2;i<100;i++){ if(isPrime(i)){ cout<&l

c++-c语言怎么让double输出没有后面的0

问题描述 c语言怎么让double输出没有后面的0 double类型输出总是带一串0 怎么让double的输出没有后面的0 解决方案 这个是格式化输出的问题,要用到 格式化输出控制符 printf("%m.nlf", num); 其中m为控制输出的列宽,n为控制小数点后的位数 解决方案二: printf("%.0d",Num); 解决方案三: double c =115.3937008; printf("%.0f",c); 解决方案四: 输出格式