2 qq 39301152 qq_39301152 于 2017.08.31 20:35 提问

关于语句倒置 部分理解 c语言实现的
 #include <stdio.h>
#include <string.h>
void output(char *str)
{
  char* tail = strchr(str,' ');

  if (tail == NULL)
    printf("%s",str);
  else
    {

      output(tail + 1);

      *tail = '\0';
      printf(" %s",str);
    }
}
int main()
{
  char str[81];
  gets(str);
  output(str);
  putchar('\n');
  return 0;
}

output(tail + 1);

  *tail = '\0';
  printf(" %s",str);这一段一直没有理解 能否讲解一下

5个回答

Kinship_Jade
Kinship_Jade   2017.08.31 22:19
已采纳

感觉这是个递归,检测到空格就会向后移继续检测,直到检测完最后一个单词,打印出来才会回到上一级,也就是倒数第二个单词,以此类推,也就把所有的单词都倒过来打印了

qwe15954250805
qwe15954250805   2017.09.01 08:49

因为are和how之间是空格而不是字符结束符,不加字符结束符的话printf无法输出字符串

chj1234chj
chj1234chj   2017.08.31 20:47

*tail = '\0';就是使str这个字符串加上结尾标志,不然输出的话会有乱码,第二句就是把字符串str的内容输出

qq_39301152
qq_39301152 那比如说我输入how are you 输入应该是you are how 我就不明白are 怎么出来的 我理解了how怎么出来的 are一直想不明白
11 个月之前 回复
qq_40052477
qq_40052477   2017.08.31 21:02

c中字符串末尾都要是\0结束.
执行到最后,tail已经 是最后一个指针的位置了,需要把他置成0,这样再下面输出的时候,就知道到那个字节结束了

qq_39301152
qq_39301152 那比如说我输入how are you 输入应该是you are how 我就不明白are 怎么出来的 我理解了how怎么出来的 are一直想不明白
11 个月之前 回复
qq_38204686
qq_38204686   2017.08.31 21:24

不理解 一步一步调试就好了

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
C语言的字符串倒置问题
#include int main() { char c[] = "hello world"; int len = 0; while (c[len])//此法求出的长度即为字符串的有效长度 { len++;//如果到了字符串的结尾,则不再加1 } printf("%d\n", len); int le = 0; while (c[le++]);//此法求出的长度比字符
C语言经典算法-字符串的颠倒
经典算法-字符串的颠倒最优状态下字符串的颠倒(字符串的反转)2005-11-18 10:18:35 FROM:http://www.exuesoft.com/article/View.aspx?NewsID=116void Reverse(char s[]){ for(int i =0,j=strlen(s)-1;i { char c=s[i];
C语言实现数组倒置(异或运算)
如题,输入一个空间为10的数组,将数组倒置并输出。要求:用尽量少的时间和空间完成分析:指定了数组长度,而不增加空间成本则不能新建新的数组,实现数组倒置可以借助第三变量互换数组元素,但此方法也不是最高效的,可以采用异或运算,比较接近底层运算速度快代码如下#include<stdio.h> int main() { int a[10]; int j,i,temp; printf(
C语言实现字符串的倒置
前后颠倒输入的英文中的单词位置,标点符号(只可以出现在句尾)位置不变,如输入"my name is gu hu!"输出应该为"hu gu is name my!"。
C语言单链表倒置,头插法详细介绍
struct node *inverse(struct node *L) { node *head=NULL,*temp; while(L!=null) { temp=L->next; L->next=head; head=L; L=temp; } return head; }
C语言-数据结构-单链表倒置
/*#include #include //单链表倒置 typedef struct node {     int data;     struct node *next; }body; body *table() {     int i,a;     body *head,*p1,*p2;     head=NULL;     for(i=0;;i++)    
如何理解依赖倒置原则?
------  读书心得 ------- 通常情况的设计都是高层模块依赖于低层模块。这样看似顺理成章,低层模块不怎么变动,高层模块调用低层模块。但是事实上,事物总是在变化,经常低层模块变化,引起高层一系列的变化。 看看依赖倒置是怎样解决这个问题的?它的两个原则: 1. 高层模块不该依赖于低层模块, 二者都该依赖于抽象 2. 抽象不应该依赖于细节,细节应该依赖于抽象 看下图,在层之
C语言实现字符串倒序
1 #include stdio.h>   2 #include stdlib.h>   3 #include string.h>   4   5 int main()   6 {   7 char *src="abcdefghijk";   8 int len=strlen(src);   9 char *dest = (char *)malloc(len+1);  10
C语言实现将数字颠倒
C语言实现将数字颠倒 #include long reverse(long number) { long tmp=0; while(number!=0) { tmp=(tmp*10 + number%10); number=number/10; } if(number<0) return (-tmp); else return tmp; }
头插法倒置单链表
关于单链表的倒置问题,有一个比较好的解法——头插法。 下面考虑包含头结点的单链表(头结点不算做第一个结点。下面提到结点时一般均是不算头结点的) “头插法”思想描述:从链表的第一个结点开始,以每一个结点为单位,遍历链表,将遍历到的结点依次插入到头结点的后面。 下面先给出链表的结构体定义