c语言 倒序输出字符串

Python015

c语言 倒序输出字符串,第1张

您好,一个汉字占用两个字节(扩展ASCII码),而getchar()每次只能读入一个字节,因此读入汉字时,则需要用gets()函数。 倒叙输出汉字串时,有两种方法,一是从字符串末端开始,每次输出两个字节,二是直接汉字将字符串在数组中倒置,然后再用puts()函数直接输出。以上两种方法都有局限性,一旦含有非汉字字符,极有有可能造成乱码。#include <stdio.h>#include <string.h>unsigned char *InverseStr(unsigned char t[],unsigned char s[]) {int i,j,len = strlen((char *)s)for(i = len - 1,j = 0i >= 0--i,++j) {if(s[i] >0X7F) { // 是汉字t[j++] = s[i - 1]t[j] = s[i]--i}else t[j] = s[i]}t[j] = '\0'return t}int main() {unsigned char s[] = "C语言char数据类型练习"unsigned char t[25]printf("s = \"%s\"\n",s)printf("t = \"%s\"\n",InverseStr(t,s))return 0}

①要求

将正整数或负整数

个位开始逆序输出。

涉及三个变量,

n是原数,

m用于储存提取的个位数,

y用于储存重新组合的逆序数。

②定义函数

#include<stdio.h>

int fun(int n)

{int m,y} ;

/*给y赋初值,组合数在组合之前为0。*/

y=0

/*给m赋初值,将原数n的绝对值赋值给m。

我试了,也可以直接m=n,删除y=(n>=0)?y:-y,结果一样有负号,绝对值具体还有什么用,等待大神解答。*/

if(n>=0)m=n

else m=-n

/*当m不为0时,循环继续。

当m为0时,即提取到只剩一位数时,m=m/10=0,循环结束。*/

while(m!=0)

{y=y*10+m%10

/*提取个位:m%10。

已经提取个位升为十位:y乘10。

逆序组合数:y。*/

m=m/10}

/*降位提取个位:m/10

不断除10取整,屏蔽个位;

不断将十位降为个位,再提取;

直到只剩一位数,循环结束。*/

y=(n>=0)?y:-y

/*将负数的负号恢复。*/

return y

}

③主函数

{int m1,m2

scanf("%d%d",&m1,&m2)

printf("%d的逆序是%d\t",m1,fun(m1))

printf("%d的逆序是%d\t",m2,fun(m2))

return 0

}

④思路整理

1.输入原数:n

2.求绝对值:m=|n|

3.提取个位:m%10

4.逆序组合:y=y*10+m%10

5.高位降位:m/10

6.恢复负号:y=(n>=0)?y:-y

逆序输出有很多种,具体的实现方法取决于你题目的要求1. 如果只是要求逆序输出,那么可以采用类似的方法:void reverse(char *s){if(*s=='\0')returnreverse(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 = cp--//尾向前挪一个reverse(s+1)//相当于头向后挪一个}return s}3.1 当然,有的时候,并不需要reverse函数本身递归,而是可以借助一些辅助的递归函数,比如说:void reversehelp(char * head, char * end){if (head <end){char c = *head*head = *end*end = creversehelp(++head, --end)}}然后在调用时像这样调用:char * reverse(char * s){char * end = s + strlen(s) - 1reversehelp(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] = creversehelp( s+1, n-2 )}}然后在调用时如下:char *reverse(char *s){reversehelp( s, strlen(s) )return s}