(c语言)将一句话的单词进行倒置,标点不倒置(i like beijing.)

简介: (c语言)将一句话的单词进行倒置,标点不倒置(i like beijing.)

例子:



"I like beijing.",经过处理后变为:"beijing. like I"。
//字符串长度不超过100。(注意不是简单的将字符串全部倒置);


思路方法:



方法:

第一步:先将字符串全部倒置;

第二步:将每个单词进行倒置;


方法2:

也可以先进行单词倒置,在将整个字符串倒置;


图解:

4263f36de7c249c7a207490ee75f26ae.png


(分板块)代码的实现:



一.字符串的获取(3种简单的方法)


注意:


这里我们不能通过循环用scanf函数来读取;因为scanf()函数遇到空格就停止读取;


例如

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
  char arr[100];
  int i = 0;
  while (scanf("%s", &arr) != EOF)
  {
    ;
  }
  return 0;
}


当输入  “ i  like   beijing." 时,arr的内容为:

86a3ee2e976044aab90b42efcf5814f5.png


解决方法:


1.用gets()函数,即使中间有空格也会读取


#include <stdio.h>
int main()
{
  char arr[100];
  printf("获取字符\n");
  gets(arr);
  printf("\narr字符串的内容为:%s\n",arr);
  return 0;
}


运行结果:

8bde240aec954ce88d7f11b61dbc9a80.png


2.用fgets()函数    


64b15227efe14605a39885a497723147.png


gets(arr,100,stdin)

用法:fgets(读取的字符放大位置(如要放入arr里),限制最多读取多少(如限制最多读取100字符,在哪里读取(如从键盘上获取stdin));

stdin——>标准输入—键盘;


注意:fgets会把(\n)回车作为字符获取;如果\n影响代码实现,不想要\n,可以在读取后,计算字符串长度然后将最后一个字符换为\0;

#include <stdio.h>
int main()
{
  char arr[100];
  printf("获取字符\n");
  fgets(arr,100,stdin);
  printf("\narr字符串的内容为:%s\n", arr);
  return 0;
}

1997a2b7e3ee41a8a055d50ef9392079.png


删去\n:

#include <stdio.h>
int main()
{
  char arr[100];
  printf("获取字符\n");
  fgets(arr,100,stdin);
  //计算字符串长度(不用sizeof的原因在在其他博客作品
  //”strlen和sizeof的区别及用法中“有写过)
  int len = strlen(arr);
  //将最后一个字符\n用\0取代,从而删去\n
  arr[len - 1] = '\0';
  printf("\narr字符串的内容为:%s\n", arr);
  return 0;
}


效果:

031ae8b2bea94dfe9ed50532c288b800.png


3.用scanf("%[^\n]s")读取也可以达到同样的效果


加了[^\n]——>意思是一直读取,直到遇到 \n (回车),即使中间有空格

#include <stdio.h>
int main()
{
  char arr[100];
  printf("获取字符\n");
  while (scanf("%[^\n]s", &arr) != EOF)
  {
    ;
  }
  printf("\narr字符串的内容为:%s\n", arr);
  return 0;
}


运行结果:(不会像最前面那样遇到空格就停止读取)


64d0ffbdcfc34c98b0075c4cd859469e.png


二.字符串倒置代码的实现:


因为后面单词的倒置和字符串的倒置相同,所以这里分装一个函数 ReversrArr( ) 来实现倒置;

这里参数只需将字符串的初末元素地址传入,用指针char* left  和char* right接收


数组名即首元素地址,容易得到;

末元素地址可以用strlen(arr)函数得到长度,再用(arr+长度-1)得到;

13975e7912ad449488de6cfa3adcc1f4.png


字符串倒置的代码实现:


//字符串倒置代码实现
void ReverseArr(char* left, char* right)
{
  while (left < right)
  {
    char tmp = *left;//中间变量
    *left = *right;
    *right = tmp;
    left++;
    right--;
  }
}
#include <stdio.h>
#include <string.h>
int main()
{
  char arr[100];
  printf("获取字符\n");
  gets(arr);
  //计算字符串的长度
  int len = strlen(arr);
    //倒置字符串
  ReverseArr(arr,arr+len-1);
  printf("%s\n",arr);
  return 0;
}


运行结果:


03b6489bbf934dcaa7f3466fd512587f.png


三.每个单词的倒置代码实现:


我们要用前面的 ReverseArr()需要知道每个单词的起始leftright

由于每个单词用 空格 隔开的,所以我们可以用 空格 来作为遍历条件

e24cff9632434d229e087f68d5530f49.png

代码实现:

//每个单词的倒置
  char* start = arr;
  char* end = arr;
  while (*end != '\0')
  {
    while (*end != ' ' && *end != '\0')
    {
      end++;
    }
    ReverseArr(start, end-1);
    start = end + 1;
    if (*end == ' ')
    {
      end++;
    }
  }


整个代码的实现:



//字符串倒置代码实现
void ReverseArr(char* left, char* right)
{
  while (left < right)
  {
    char tmp = *left;
    *left = *right;
    *right = tmp;
    left++;
    right--;
  }
}
#include <stdio.h>
#include <string.h>
int main()
{
  char arr[100];
  printf("获取字符\n");
  gets(arr);
  /*printf("%s\n",arr);*/
  //计算字符串的长度
  int len = strlen(arr);
  ReverseArr(arr,arr+len-1);
  /*printf("%s\n",arr);*/
  //每个单词的倒置
  char* start = arr;
  char* end = arr;
  while (*end != '\0')
  {
    while (*end != ' ' && *end != '\0')
    {
      end++;
    }
    ReverseArr(start, end-1);
    start = end + 1;
    if (*end == ' ')
    {
      end++;
    }
  }
  printf("%s\n",arr);
  return 0;
}


运行结果:

8ff2d77ac07e4e9dbfd5321305d67ab9.png


知识点总结:



1.该算法思想

2.字符串输入(获取)的3种方法

     1.  scanf("%[^\n]s",&arr)  注意:scanf("%s",&arr)遇到空格会停止读取    

加了[^\n]——>意思是一直读取,直到遇到 \n (回车),即使中间有空格

     2.gets(arr)   可以读取空格

     3.fgets(arr,100,stdin)  

          arr --->读取的文本放在哪里(arr)

         100--->读取的最大限制

         stdin--->标准输入----键盘

         注意:fgets会把(\n)回车作为字符获取;如果\n影响代码实现,不想要\n,可以在读取                后,计算字符串长度然后将最后一个字符换为\0;删除方法示例在前面fgets处

3.倒置字符串和单词的方法

目录
相关文章
|
6月前
|
人工智能 BI C语言
C语言----------最后一个单词的大小
C语言----------最后一个单词的大小
45 0
|
6月前
|
缓存 C语言
C语言 : 将一句话的单词进行倒置(逆序)
C语言 : 将一句话的单词进行倒置(逆序)
68 0
|
6月前
|
存储 C语言 容器
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别(下)
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别
45 1
|
6月前
|
存储 C语言 容器
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别(中)
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别
47 1
|
6月前
|
存储 自然语言处理 C语言
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别(上)
从C语言到C++_26(set+map+multiset+multimap)力扣692+349+牛客_单词识别
59 1
|
6月前
|
C语言
C语言刷题:整数加逗号、删除公共字符、求最小公倍数和将字符串倒置
C语言刷题:整数加逗号、删除公共字符、求最小公倍数和将字符串倒置
75 0
|
编译器 C语言
C语言:将一句话的单词进行倒置,标点不倒置。
总体思路: (可以把两步顺序调换) 第一步: 把 整个字符串 逆序 (知道 整个字符串 的首尾地址后,一对一对向整个字符串中间靠拢交换)
127 0
|
C语言
C语言,倒置字符串
C语言,倒置字符串
|
前端开发 C语言
【C语言】字符串逆序与三步翻转法(倒置字符串)
【C语言】字符串逆序与三步翻转法(倒置字符串)
182 0
【C语言】字符串逆序与三步翻转法(倒置字符串)
|
C语言
【C语言典例】:倒置字符串
【C语言典例】:倒置字符串
105 0