使用C语言实现字符串逆序操作

这篇文章主要介绍了使用C语言实现字符串逆序操作案例,本文包含使用C语言的两种方法去实现,递归和非递归,以下就是详细内容,需要的朋友可以参考下

编写一个函数 reverse_string(char * string)
实现:将参数字符串中的字符反向排列。
要求:不能使用C函数库中的字符串操作函数。比如:char arr[]="abcdef" 输出:fedcba

思路:(非递归)arr里存放的字符:

 

a b c d e f

输出后的arr里存放的字符:

f e d c b a

我们需要将字符a和字符f调换,字符b和字符e调换,字符c和字符d调换,怎么调换呢?这就需要指针

1.首先,我们写主函数

int main() 
{  
  char arr[] = "abcdef";  
  reverse_string(arr);  
  printf("%sn", arr);  //%s是打印字符串格式
  return 0; 
}

有人问,everse_string(arr)调用函数时形参不是要用指针,实参那里应该是个地址啊,reverse_string(arr)中arr应该是&arr,但其实arr本身就是给地址,数组名arr就是arr首元素的地址,就是字符a

2.主函数写完后,我们写函数reverse_string

void reverse_string(char* str)
{  
   int left = 0; 
   int right = my_strlen(str) - 1; 
   while (left < right)  
     {   
        char temp = str[left]; 
        str[left] = str[right];   
        str[right] = temp;   
        left++;   
        right--;  
     } //若left=right,不用交换字符
} 

为什么用void类型而不用int类型?因为这里传址改变的是数组arr里的元素顺序,不需要改变它的值,不需要返回数组,所以用void

这里left和right定义的是数组下标,left初始化为0,代表的是arr[0],即字符a,而right,我们想要让它定义字符f,也就是arr最后一个字符的下标,怎么做呢?我们可以先求字符串的长度,然后减1就是arr的最后一个字符位置,但是题目不能使用库函数中的字符串操作函数,所以我们要在函数reverse_string里嵌套另一个函数my_strlen,用来实现求字符串长度

3.编写函数my_strlen

int my_strlen(char* str) //求字符串长度
{  
  int count = 0;
  while(*str != '')  //这里不能用if,因为if是选择语句,不能实现循环
    {   
       count++;   
       str++;  //指向下一指针
    }  
   return count;
}

​//遇到停止循环

最终代码如下:

#include<stdio.h>
int my_strlen(char* str) //求字符串长度
{  
  int count = 0;
  while(*str != '')  //这里不能用if,因为if是选择语句,不能实现循环
    {   
       count++;   
       str++;  //指向下一指针
    }  
   return count;
}

void reverse_string(char* str)
{  
   int left = 0; 
   int right = my_strlen(str) - 1; 
   while (left < right)  
     {   
        char temp = str[left]; 
        str[left] = str[right];   
        str[right] = temp;   
        left++;   
        right--;  
     } //若left=right,不用交换字符
} 

int main() 
{  
  char arr[] = "abcdef";  
  reverse_string(arr);  
  printf("%sn", arr);    //%s是打印字符串格式
  return 0; 
}

 输出结果:

 

 递归思路:

a b c d e f

abcdef的逆序可以看成a和f交换,加上bcde的逆序,然后bcde的逆序可以看成b和e交换加上cd的逆序,cd的逆序可以看成c和d交换

①将字符a取出来

  b c d e f
a

②将字符f交换到a的位置

f b c d e
a

③在f的位置放''

f b c d e
a

为什么要放斜杠0?若将bcde传给函数reverse_string,完成不了逆序的实现,因为如果f所在的位置不是斜杠0,函数会判别后面还有字符,实现不了逆序,若放斜杠0,此时函数会将bcde看成字符串,实现逆序的功能

④将中间的bcde传给函数,实现逆序

⑤将字符a放在最开始字符f的位置

f b c d e a

通过上述步骤,我们可以发现④是个递归的过程

 reverse_string函数如下

void reverse_string(char* str)
{  
   char temp = *str;  // 对应步骤①  可写成char temp=str[0];  代表字符a
   int len = my_strlen(str);  //求字符串长度
   * str = *(str + len - 1 );  //对应步骤② 可写成str[0]=str[len-1]
   *(str + len - 1 )= '';//对应步骤③ 可写成str[len-1]=''
                             //末尾置''方便计算字符串长度以及置换其他位置  
   if (my_strlen(str+1)>=2)  
   {   
      reverse_string(str + 1);  //对应步骤④ 
   }  
//若不加if条件语句,调用函数没有判断条件,也就没有限制条件,就会导致死循环
//当到cd交换时,中间无字符可逆序或者只剩下一个字符时,没必要逆序
   *(str + len - 1 )= temp;//对应步骤⑤ 可写成str[len-1]=temp   将末尾置换
}

最终代码:

#include<stdio.h>
int my_strlen(char* str) //求字符串长度
{
    int count = 0;
    while (*str != '')  //这里不能用if,因为if是选择语句,不能实现循环
    {
        count++;
        str++;  //指向下一指针
    }
    return count;
}


void reverse_string(char* str)
{
    char temp = *str;  // 对应步骤①  可写成char temp=str[0];  代表字符a
    int len = my_strlen(str);  //求字符串长度
    *str = *(str+len-1);//对应步骤② 可写成str[0]=str[len-1]
    *(str+len-1) = '';//对应步骤③ 可写成str[len-1]=''
    //末尾置''方便计算字符串长度以及置换其他位置  
    if (my_strlen(str + 1) >= 2)
    {
        reverse_string(str + 1);  //对应步骤④ 
    }
    //若不加if条件语句,调用函数没有判断条件,也就没有限制条件,就会导致死循环
    //当到cd交换时,中间无字符可逆序或者只剩下一个字符时,没必要逆序
    *(str+len-1) = temp;//对应步骤⑤ 可写成str[len-1]=temp   将末尾置换
}

int main()
{
    char arr[] = "abcdef";
    reverse_string(arr);
    printf("%sn", arr);    //%s是打印字符串格式
    return 0;
}

输出结果:

 

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>