C语言实现倒置字符串的两种方法分享

 

前言

今天在牛客网上刷了一道题,我感觉挺有意义的,现在我就分享给大家,并且告诉大家解题思路。

 

一、题目

事例:

输入下列字符:

I like beijing.

输出的字符:

beijing. like I

 

二、思路讲解

1、设立一个数组存放输入的字符串

2、将其中每个单词进行逆置 得到 I ekil .gnjieb

3、再将字符串逆置 得到beijing.like I

 

三、代码实现

1.设立一个数组存放输入的字符串

#include <stdio.h>

int main()
{
  char arr[100] = { 0 };
  gets(arr);//注意没有使用scanf,因为scanf遇到空格就会停止接收输入的内容

  printf("%s\n",arr);

  return 0;
}

2、将每个单词进行逆置

这其中需要注意几点:

1.整个语句如何结束循环

2.每个单词的起始位置和结束位置

3.内部如何实现

4. 判断语句结束,从而停止逆序

语句如何结束循环:

    char* t = arr;//将字符数组首元素的地址放入指针变量t中
  while (*t!='\0') {  
//判断当*t指向'\0'时循环结束。
}

每个单词的起始位置和结束位置 :

char* t = arr;//将字符数组首元素的地址放入指针变量t中
  while (*t!='\0') {  //判断当*t指向'\0'时循环结束。
      char* start = t;
      char* end = t;
        //当末指针指向空格,并且指向‘\0'循环结束。
      while (*end != ' '&&*end != '\0') {
          end++;
      }

内部怎么实现:

我们需要再自己定义一个函数reverse,用来实现字符串的交换

void reverse(char* left, char* right) {
  while (left < right) {//只有当左边的地址小于右边的地址时,才交换,中间的不需要交换
      char tmp = *right;
      *right = *left;
      *left = tmp;
      left++;
      right--;
  }
}

再调用这个函数:

int main() {
  char arr[100] = { 0 };
  gets(arr); //输入字符数组
  char* t = arr;//将字符数组首元素的地址放入指针变量t中
  while (*t!='\0') {  //判断当*t指向'\0'时循环结束。
      char* start = t;
      char* end = t;
        //当末指针指向空格,并且指向‘\0'循环结束。
      while (*end != ' '&&*end != '\0') {
          end++;
      }
      reverse(start, end - 1);
  }

怎样判断语句结束呢,从而停止逆序呢

if (*end != '\0')//判断是否到了字符串末尾
          t = end + 1;//让指针p指向下一个单词,让循环进入下一个单词
      else
          t = end;

3、将字符串逆置

这个要用到计算字符串长度的strlen函数,

int len = strlen(arr);

再调用reverse函数:

reverse(arr, arr + len - 1);

 

四、代码总结

void reverse(char* left, char* right) {
  while (left < right) {
      char tmp = *right;
      *right = *left;
      *left = tmp;
      left++;
      right--;
  }
}
int main() {
  char arr[100] = { 0 };
  gets(arr); //输入字符数组
  char* t = arr;//将字符数组首元素的地址放入指针变量t中
  while (*t!='\0') {  //判断当*t指向'\0'时循环结束。
      char* start = t;
      char* end = t;
        //当末指针指向空格,并且指向‘\0'循环结束。
      while (*end != ' '&&*end != '\0') {
          end++;
      }
      reverse(start, end - 1);
      if (*end != '\0')//判断是否到了字符串末尾
          t = end + 1;//让指针p指向下一个单词,让循环进入下一个单词
      else
          t = end;
  }
  int len = strlen(arr);
  reverse(arr, arr + len - 1);
  printf("%s\n", arr);
  return 0;
}

 

五、第二种方法倒置字符串

方法二的思路是这样先用t指向字符串的末尾,然后往前走,找到空格时,printf一下,以%s格式,这样打印只需要给字符串的首地址,它打印到\0停下。我们打印完一个单词后,把t的位置变成\0,然后继续往前走,直到数组开始位置。

t指针开始指向字符串最后一个字符,然后往前遍历,直到空格或者t到了最开始的字符位置,这里分两种情况,到空格位置,要把空格位置变成\0,打印cur+1位置,到首字符,打印cur位置。

其中需要注意一点,我们把空格位置变成了\0,所以在第一种情况需要打印的时候在加个空格

代码如下:

int main()
{
  char arr[100] = { 0 };
  gets(arr);
  char* t = arr + strlen(arr) - 1;  //将t指针指向字符串最后一个字符
  while (t > arr)    //当t指针的地址大于arr首元素地址开始循环
  {
      while (*t != ' ' && t > arr)  //当t不为空格时,t指针往前循环指向
      {
          t--;
      }

      if (t == arr)
      {
          printf("%s", t);
      }
      else //到空格,打印t+1位置
      {
          printf("%s ", t + 1);
          *t = '\0';   //把空格位置变成‘\0'
      }
  }
  return 0;
}

 

六、总结

今天的分享就到这了,第一种方法用数组,字符串逆置,容易想到,第二种方法,思路难,代码简单,两种方法都可以,今天的分享就到这了,谢谢大家的支持。

关于C语言实现倒置字符串的两种方法分享的文章就介绍至此,更多相关C语言倒置字符串内容请搜索编程宝库以前的文章,希望以后支持编程宝库

 函数模板当我们想要定义一个可以支持泛型的函数时,就要采用函数模板的方式了。所谓泛型就是可以支持多种类型的操作,比如我们定义一个compare操作,他可以根据传递给他的参数类型动态调用对应的函数 ...