您的位置:首页 > 其它

字符串反转问题

2017-12-11 16:56 197 查看
我的思路是,首先将这个字符串整个逆序,再将其中的每一个单词再次逆序,得到最终结果,刚开始没有思路的时候在纸上画画,有助于编程,这是我近期学习C语言的心得。

接下来我们来编程解决这个问题。

#include <stdio.h>
#include <assert.h>
int my_strlen(const char *str)//求字符串长度函数
{
int count = 0;
assert(str);
while(*str != '\0')
{

count++;
str++;
}
return count;

}
void reverse(char a[],int left,int right)//逆序函数
{
while(left<right)
{
char tmp=a[left];
a[left]=a[right];
a[right]=tmp;
left++;
right--;
}

}
char* reverse_string(char a[])//逆序字符串
{
int i = 0;
int left = 0;
int right = my_strlen(a)-1;//逆序整个字符串
reverse(a,left,right);
//逆序逐个单词
while(a[i]!='\0')
{
left = i;
while((a[i]!='\0')&&(a[i]!=' '))
{
i++;

}
right=i-1;
reverse(a,left,right);
if(a[i]!='\0')
i++;
}
return a;
}

int main()
{
char a[]="student a am i";
reverse_string(a);
printf("%s\n",a);
return 0;
}


普通字符串反转:

方法一,用while循环交换首尾。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

char *reverse(char *start,char *end)//翻转字符串
{
char *ret=start;
assert(start);
assert(end);
while(start<end)
{
char tmp=*start;
*start=*end;
*end=tmp;
start++;
end--;
}
return ret;
}

int main()
{
char arr[]="tneduts a ma i";
int sz=sizeof(arr)/sizeof(arr[0])-1;//减去‘\0’
char *ret=reverse(arr,arr+sz-1);
printf("%s\n",ret);
system("pause");
return 0;
}


方法二:

函数递归调用

问题描述:

编写一个函数reverse_string(char *srring)(递归实现)

实现:将参数字符串中的字符反向排列。

要求:不能使用处C库函数中的字符串操作函数。

程序分析:

思路如下:

本程序用递归的思想实现这一功能,最关键的一点是要改变’\0’所在的位置。a.先交换字符串最外层的两个字符,同时保存第一个字符的值(称之为压栈) b.将指针指向下一个字符,将两个值交换后的最后一个字符赋为’\0’,从而减小问题的规模。c.递归调用,相当于传入新的字符串。d.递归调用结束后,把之前保存的值又返回到相应的字符串的位置。

#include<stdio.h>

/*******递归的方式写字符串长度函数*******/
int my_strlen(char *str)
{
if(*str == '\0')    //当传入的字符串中没有字符
return 0;       //字符串长度为0
else
return 1+ my_strlen(str+1); /*运用递归,每递归一次
长度加1,直到遍历到的'\0'时结束递归*/
}
/*******递归方式写字符串反转*******/
void reverse_string(char *string)
{
int len = my_strlen(string);//调用上面的字符串长度函数;
if(len <= 1) //当字符串长度小于等于1时,不执行;
return ;
else
{
char temp = string[0];   //将第一个字符的值保存在temp中;
string[0] = string[len-1];//将最后一个字符赋给第一个字符;
string[len-1] = '\0';   //将最后一个字符的内容赋为'\0';
reverse_string(string+1);//递归调用下一次反转;
string[len-1] = temp;   //将temp赋给当前的最后一个字符;
}
}

int main()
{
char ch[] = "abcdefghijklmno";
reverse_string(ch);
printf("%s ",ch);
printf("\n");
getchar();  //缓冲;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: