C语言:将一句话的单词进行倒置,标点不倒置。

news/2024/12/12 20:42:14/

题目:

一句话单词进行倒置标点不倒置。(字符数组长度不超过100)

比如:I like beijing.

经过函数后变为:beijing. like I

                    

 =========================================================================

                       

思路:

总体思路:

可以两步顺序调换
               

第一步把 整个字符串 逆序

(知道 整个字符串 首尾地址后,一对一对向整个字符串中间靠拢交换

           

第二步再逆序 每个单词
(知道 每个单词首尾地址后,一对一对向单词中间靠拢交换

              

两步中逆序的方法一样的,可以写一个相应的 自定义函数reverse

                


                 

补充知识点一:gets()

读取一个 字符串即使中间有空格

               

    gets(arr);  --  把读取到的字符串 放进 字符串数组arr

               

(编译器可能会觉得该函数不安全而报警告,因为读取的字符串放进数组后可能会导致数组越界,可能会报错爆红,但还是可以用的)

                


                 

补充知识点二:fgets()

可以使用 fgets()函数 替代 gets()函数

               

fgets(arr, 100, stdin);

               

函数参数:

               

arr:把读取的字符串放进字符数组arr

               

100获取字符串最大字符数,这里设置为100

               

stdin输入方式stdin 键盘输入

               

(因为指定了获取的字符个数,所以不用担心数组越界,也就不会报警告

                


                 

第一步:

完成 逆序自定义函数reverse 编写:

         

(1).  

函数参数:

char* left -- 左元素位置

char* right -- 右元素位置

         

(2).

使用 while循环left < right 继续循环逆序,因为此时数组还有数

                

使用临时变量tmp,进行数组元素调换

         

调换一次后就调整一次左右位置

                     

实现代码:

#include <stdio.h>//逆序自定义函数 reverse:
void reverse(char* left, char* right)
{//使用while循环:while (left < right)//左小于右,说明中间还有值且没有指向一个字符,继续逆序{//使用临时变量tmp进行逆序:char tmp = *left;*left = *right;*right = tmp;//调换后调整左右位置left++;right--;}
}int main()
{}

实现图片:

                 


                 

第二步:

主函数:

            

(1). 定义字符数组,数组长度不超过100,那就设置为101

         

(2). 使用 gets(arr); 读取到的字符串 放进 字符串数组arr

            

(3). 求字符串长度 -- strlen(arr); 需要头文件<string.h>

            

(4). 使用 逆序自定义函数reverse 逆序 整个字符数组

整个数组arr的左右下标传给函数reverse即可

                     

实现代码:

#include <stdio.h>
#include <string.h>//逆序自定义函数 reverse:
void reverse(char* left, char* right)
{//使用while循环:while (left < right)//左小于右,说明中间还有值且没有指向一个字符,继续逆序{//使用临时变量tmp进行逆序:char tmp = *left;*left = *right;*right = tmp;//调换后调整左右位置left++;right--;}
}int main()
{//定义字符数组:char arr[101];//使用 gets(arr) 获取字符串gets(arr);//求字符串长度:int len = strlen(arr);//strlen 不会把 \0 计算进去,找到 \0 就停了//需要头文件:<string.h>//逆序整个字符串:reverse(arr, arr + len - 1); //调用自定义逆序函数//函数参数:数组首地址(左指针)、最后一个字符的地址(右指针)//arr+len-1:首地址 + 数组长度 - 1 --> 最后一个字符的地址
}

实现图片:

                 


                 

第三步:

主函数:逆序整个单词:

         

(1). 定义单词 起始 尾部 位置

char* start; -- 单词起始位置

char* cur; -- 单词尾部位置

              

(2). 使用 while循环 循环查找单词并逆序单词

*cur 单词尾部还没有到结束符 '\0' 就继续找单词

            

(3). 内嵌 while循环 ,调整 cur 单词尾部位置:

*cur 单词尾部还没有到 空格(每个单词间隔一个空格) 

 还没到结束符 '\0' 

cur++调整当前单词尾部位置

             

(4). 经过上一个步骤,找到了一个单词(第一次while循环),

对该单词进行逆序

调用 逆序函数reverse,

将该单词的首位(左右)位置传给reverse即可

                     

(5). 调整 start 单词起始位置到下一个单词的起始位置

start = cur +1; -- cur + 1, 空格后的下一个位置就是下一个单词的起始位置 

               

(6). 调整 cur 单词尾部位置

先使用 if条件判断语句 调整到空格后一位,即单词起始位置

再在下一次循环通过内嵌的 while循环 调整到该单词的尾部位置

              

实现代码:

#include <stdio.h>
#include <string.h>//逆序自定义函数 reverse:
void reverse(char* left, char* right)
{//使用while循环:while (left < right)//左小于右,说明中间还有值且没有指向一个字符,继续逆序{//使用临时变量tmp进行逆序:char tmp = *left;*left = *right;*right = tmp;//调换后调整左右位置left++;right--;}
}int main()
{//定义字符数组:char arr[101];//使用 gets(arr) 获取字符串gets(arr);//求字符串长度:int len = strlen(arr);//strlen 不会把 \0 计算进去,找到 \0 就停了//需要头文件:<string.h>//逆序整个字符串:reverse(arr, arr + len - 1); //调用自定义逆序函数//函数参数:数组首地址(左指针)、最后一个字符的地址(右指针)//arr+len-1:首地址 + 数组长度 - 1 --> 最后一个字符的地址//逆序每个单词://定义 单词的 起始 和 尾部 位置:char* start = arr; //单词起始位置char* cur = arr; //单词尾部位置,后面再调整//使用 while循环 循环查找并逆序单词:while (*cur != '\0')//整个字符串还没结束,继续找单词{//内嵌 while循环 调整单词尾部位置cur:while (*cur != ' ' && *cur != '\0')//单词尾部未找到空格且还没有结束符就继续往后移一位{cur++;//往后移一位}//直到找到单词,此时在空格位置//找到单词后进行单词逆序:reverse(start, cur - 1);//因为单词尾部 cur 此时在 空格位置,//所以要在空格(或\0,最后一个单词)位置前-1//找下一个单词://调整start单词起始位置:start = cur + 1;//cur+1,空格后的下一个位置就是下一个单词的首地址//调整单词尾部位置:if (*cur == ' ')//只有是空格时才能跳过,\0不能再跳过了,不然就跳不出循环了{cur++;//调整下一个单词尾部位置到起始位置}}}

实现图片:

                 


                 

第四步:

两个逆序都完成后,进行打印

                     

实现代码:

#include <stdio.h>
#include <string.h>//逆序自定义函数 reverse:
void reverse(char* left, char* right)
{//使用while循环:while (left < right)//左小于右,说明中间还有值且没有指向一个字符,继续逆序{//使用临时变量tmp进行逆序:char tmp = *left;*left = *right;*right = tmp;//调换后调整左右位置left++;right--;}
}int main()
{//定义字符数组:char arr[101];//使用 gets(arr) 获取字符串gets(arr);//求字符串长度:int len = strlen(arr);//strlen 不会把 \0 计算进去,找到 \0 就停了//需要头文件:<string.h>//逆序整个字符串:reverse(arr, arr + len - 1); //调用自定义逆序函数//函数参数:数组首地址(左指针)、最后一个字符的地址(右指针)//arr+len-1:首地址 + 数组长度 - 1 --> 最后一个字符的地址//逆序每个单词://定义 单词的 起始 和 尾部 位置:char* start = arr; //单词起始位置char* cur = arr; //单词尾部位置,后面再调整//使用 while循环 循环查找并逆序单词:while (*cur != '\0')//整个字符串还没结束,继续找单词{//内嵌 while循环 调整单词尾部位置cur:while (*cur != ' ' && *cur != '\0')//单词尾部未找到空格且还没有结束符就继续往后移一位{cur++;//往后移一位}//直到找到单词,此时在空格位置//找到单词后进行单词逆序:reverse(start, cur - 1);//因为单词尾部 cur 此时在 空格位置,//所以要在空格(或\0,最后一个单词)位置前-1//找下一个单词://调整start单词起始位置:start = cur + 1;//cur+1,空格后的下一个位置就是下一个单词的首地址//调整单词尾部位置:if (*cur == ' ')//只有是空格时才能跳过,\0不能再跳过了,不然就跳不出循环了{cur++;//调整下一个单词尾部位置到起始位置}}//两个逆序都完成后,进行打印:printf("%s", arr);}

实现图片:

                    

最终代码和实现效果

最终代码:

#include <stdio.h>
#include <string.h>//逆序自定义函数 reverse:
void reverse(char* left, char* right)
{//使用while循环:while (left < right)//左小于右,说明中间还有值且没有指向一个字符,继续逆序{//使用临时变量tmp进行逆序:char tmp = *left;*left = *right;*right = tmp;//调换后调整左右位置left++;right--;}
}int main()
{//定义字符数组:char arr[101];//使用 gets(arr) 获取字符串gets(arr);//求字符串长度:int len = strlen(arr);//strlen 不会把 \0 计算进去,找到 \0 就停了//需要头文件:<string.h>//逆序整个字符串:reverse(arr, arr + len - 1); //调用自定义逆序函数//函数参数:数组首地址(左指针)、最后一个字符的地址(右指针)//arr+len-1:首地址 + 数组长度 - 1 --> 最后一个字符的地址//逆序每个单词://定义 单词的 起始 和 尾部 位置:char* start = arr; //单词起始位置char* cur = arr; //单词尾部位置,后面再调整//使用 while循环 循环查找并逆序单词:while (*cur != '\0')//整个字符串还没结束,继续找单词{//内嵌 while循环 调整单词尾部位置cur:while (*cur != ' ' && *cur != '\0')//单词尾部未找到空格且还没有结束符就继续往后移一位{cur++;//往后移一位}//直到找到单词,此时在空格位置//找到单词后进行单词逆序:reverse(start, cur - 1);//因为单词尾部 cur 此时在 空格位置,//所以要在空格(或\0,最后一个单词)位置前-1//找下一个单词://调整start单词起始位置:start = cur + 1;//cur+1,空格后的下一个位置就是下一个单词的首地址//调整单词尾部位置:if (*cur == ' ')//只有是空格时才能跳过,\0不能再跳过了,不然就跳不出循环了{cur++;//调整下一个单词尾部位置到起始位置}}//两个逆序都完成后,进行打印:printf("%s", arr);}

实现效果:


http://www.ppmy.cn/news/476940.html

相关文章

洛谷B2130 简单算术表达式求值(switch,break)

题目描述 两位正整数的简单算术运算&#xff08;只考虑整数运算&#xff09;&#xff0c;算术运算为&#xff1a; &#xff0c;加法运算&#xff1b; -&#xff0c;减法运算&#xff1b; *&#xff0c;乘法运算&#xff1b; /&#xff0c;整除运算&#xff1b; %&#xf…

TMC2130-TA步进电机驱动芯片

TMC2130-TA是一种用于两相步进电机的高性能驱动IC。为3D打印、相机、扫描仪和其他自动化设备应用提供了一个集成的电机驱动器解决方案。该设备有一个集成的微步索引器&#xff0c;无传感器失速检测技术StallGuard2™&#xff08;无传感器失速检测和机械负载测量&#xff09;、无…

2130. 链表最大孪生和

在一个大小为 n 且 n 为 偶数 的链表中&#xff0c;对于 0 < i < (n / 2) - 1 的 i &#xff0c;第 i 个节点&#xff08;下标从 0 开始&#xff09;的孪生节点为第 (n-1-i) 个节点 。 比方说&#xff0c;n 4 那么节点 0 是节点 3 的孪生节点&#xff0c;节点 1 是节点…

【LeetCode 2130】链表最大孪生和

题目 在一个大小为 n 且 n 为 偶数 的链表中&#xff0c;对于 0 < i < (n / 2) - 1 的 i &#xff0c;第 i 个节点&#xff08;下标从 0 开始&#xff09;的孪生节点为第 (n-1-i) 个节点 。 比方说&#xff0c;n 4 那么节点 0 是节点 3 的孪生节点&#xff0c;节点 1 …

zzuli 2130: hipercijevi bfs+输入输出外挂 (2017轻工业校赛 )

2130: hipercijevi Time Limit: 1 Sec Memory Limit: 128 MB Submit: 749 Solved: 156 SubmitStatusWeb Board Description 在遥远的星系&#xff0c; 最快的交通方式是用某种管道。 每个管道直接互相连接N个站。 那么我们从第一个站到第N个站最少要经过多少个站呢&#x…

LeetCode 2130. 链表最大孪生和(链表快慢指针+反转链表+双指针)

文章目录 1. 题目2. 解题 1. 题目 在一个大小为 n 且 n 为 偶数 的链表中&#xff0c;对于 0 < i < (n / 2) - 1 的 i &#xff0c;第 i 个节点&#xff08;下标从 0 开始&#xff09;的孪生节点为第 (n-1-i) 个节点 。 比方说&#xff0c;n 4 那么节点 0 是节点 3 的…

51Nod 1922 乘法 2130进制转换

//51Nod 1922 乘法 #include<bits/stdc.h> using namespace std; int Atoi(string s,int n){//n进制转10进制 int ans0;for(int i0;i<s.size();i){char ts[i];if(t>0&&t<9)ansans*nt-0;else ansans*nt-a10;}return ans; } int xunzhao(string a,string …

TRINAMIC静音步进驱动芯片TMC2130TMC2208在3D打印机中的应用

&#xfeff;&#xfeff; TRINAMIC静音步进驱动芯片TMC2130TMC2208在3D打印机中的应用 3D打印(3DP)即快速成型技术的一种&#xff0c;它是一种以数字模型文件为基础&#xff0c;运用粉末状金属或塑料等可粘合材料&#xff0c;通过逐层打印的方式来构造物体的技术&#xff0c;是…