C语言关于字符倒序输出

Python012

C语言关于字符倒序输出,第1张

为什么我用你的程序测试是正常的?

你的程序逻辑搞复杂了,我给你改一个版本:

#include

int

main()

{

int

i=5

void

converse(int

n)

printf("Input

5

characters:")

converse(i)

printf("\n")

return

1

}

void

converse(n)

{

char

next

if(n

==

0)

return

next=getchar()

converse(n-1)

putchar(next)

}

记住你输入的任何字符都会算入5个之内,包括空格,换行,table等

逆序输出有很多种,具体的实现方法取决于你题目的要求

1. 如果只是要求逆序输出,那么可以采用类似的方法:

void reverse(char *s)

{

if(*s=='\0')

return

reverse(s+1)

printf("%c",*s)

}

这种方法在s很长的情况下会一直递归到底,不是很好。

2. 如果需要将字符串整个逆序在函数外面输出,那么可能希望采用返回字符串指针的方式实现如下:

char * reverse( char* s )

{

static char *p = s+strlen(s)-1//p是一个静态变量,指向当前递归层处理的字符串尾,而s指向字符串头

if(s <p)

{

char c = *p//交换头尾字符

  *p = *s

 *s = c

p--//尾向前挪一个

reverse(s+1)//相当于头向后挪一个

}

return s

}

3.1 当然,有的时候,并不需要reverse函数本身递归,而是可以借助一些辅助的递归函数,比如说:

void reversehelp(char * head, char * end)

{

if (head <end)

{

char c = *head

*head = *end

*end = c

reversehelp(++head, --end)

}

}

然后在调用时像这样调用:

char * reverse(char * s)

{

char * end = s + strlen(s) - 1

reversehelp(s, end)

return s

}

3.2 类似的辅助函数还可以采用一个字符串指针和一个长度参数的方式,如下例:

void reversehelp( char* s, int n )

{

if ( n >1 )

{

char c = s[n-1]

s[n-1] = s[0]

s[0] = c

reversehelp( s+1, n-2 )

}

}

然后在调用时如下:

char *reverse(char *s)

{

reversehelp( s, strlen(s) )

return s

}

#include<stdio.h>

#include<string.h>

void main()

{

char string1[200]//用于存放输入的字符串

char string2[200]//用于存放倒序后的字符串

int invertion(char *ch1, char *ch2)//声明函数

printf("Please input a sentences:\n")

gets(string1)//这里不要用scanf,因为scanf遇到空白符就会结束

printf("Your inputed sentences is:%s\n", string1)

invertion(string1, string2)

printf("The invertion sentences is:%s\n", string2)

getchar()

}

int invertion(char *ch1, char *ch2)/*char1 接收实参传过来的原字符串指针 char2 接收倒序后的新字符串返回主函数*/

{

int count = 1,num=0

char *ch=ch1

for(*ch1!='\0'ch1++)// 统计单词个数

{

if(*ch1==' ')

count++//单词数等于空格数加1,前面把count初始化为1就是这个原因

if(*ch1==' '&&*(ch1+1)==' ') //防止单词之间有2个空格符而多计数了一个单词数

count--

}

printf("count = %d\n", count)

ch1=ch1-1//前面的ch1经过循环之后已经指向字符串的结束标志'\0',这里减1是为了让它指向字符串的最后一个字符

while(ch1>=ch)//让ch1从指向string1的最后一个字符开始往前递减,当减到字符串的首个字符时结束

{ int j=num//保存num,后面要用到这个数

if(*ch1!=' ')//记录每个单词的长度 ,以空格符作为标志

num++

else // 知道了每个单词的长度之后,就可以用循环将字符以单词为单位写入数组string中,这样的话单词内就不会倒序了

{

for(int i=1i<=ji++,num--)

*(ch2-num)=*(ch1+i)

*ch2=*ch1

}

ch1--

ch2++

}

for(int i=1i<=numi++,ch2++)//因为string1的第一个单词前没有空格符,肯定输不出来,所以单独用一个循环将其输出

*(ch2-num)=*(ch1+i)

*ch2='\0'//string2的结束标志

}

这是我做了修改之后的程序,看看符不符合要求!!

你的那个定义的变量太多,很混乱!循环语句太乱了,if判断条件与循环条件不正确

已经做了修改,看符合要求不,不行的话,再说!!!

又做了修改了,看符合要求不??

不会吧,我调试通过还运行了!!不然怎么会发上来啊!!至于算法问题我给注释吧,你看看!!