给定一个字符串,按单词将该字符串逆序
来源:互联网 发布:vscode 远程编辑 编辑:程序博客网 时间:2024/05/16 12:39
在学习过程中,遇到这样一个功能:请输入一个字符串,将其逆序排列。
- 如输入"hello world",输出为"world hello"。
- 思路: 先按单词逆序,再对整个句子逆序。
- "hello world" ==> "olleh dlrow" ==> "world hello"
那么,需要做两部分功能:
第一,给定单词的首地址和尾地址,将其倒序(也就是交换功能)
第二,将一个句子拆分为每个单词:
单词尾地址根据指针q遇到(连续空格的)第一个空格判定:q-1
单词首地址根据指针q遇到的不再是空格判定
代码:
- /*************************************************
- 题目: 给定一个字符串,按单词将该字符串逆序,不包括标点
- 如输入"hello world",输出为"world hello"。
- *************************************************/
- #include<stdio.h>
#include <stdlib.h>
void reverseWord(char *start, char *end)
{
char temp;
while(start < end)
{
temp=*start ;
*start = *end;
*end = temp;
*start++;
*end--;
}
}
int main( ) {
char s[100]="i am a boy";
// printf("please input a string:\n");
//gets(s); //从stdio流中读取字符串,直至接受到换行符或EOF时停止
char *p=s;
char *q=s;
printf("倒序前:%s\n", s);
printf("开始地址:%x\n",q);
while(*q != '\0')
{
if(' ' == *q) //单词结尾:q首次遇到空格(此时将单词头地址p,和单词尾地址q-1)
{
printf("第一个空格地址:%x\n",q);
reverseWord(p,q-1);
while(' ' == *q ) //单词开头:q跳若干空格后下一单词首字符
{
printf("space skip地址:%x\n",q);
q++;
}
p=q; //单词头地址赋值给p
}
else
{
q++; //单词内部地址自加
}
}
reverseWord(p,q-1); //将最后一个单词逆序
reverseWord(s,q-1); //将整句话逆序
printf("结尾地址:%x\n",q);
printf("倒序后:%s\n", s);
system("pause");
return 0;
}
改进之处在于:
网上的答案都没有考虑如果相邻之处如果有连续空格的情况,他们对空格也不停的翻转
自己考虑到该功能其实稍微改进一下就是统计单词数功能,因此,如果遇到连续空格将其调过,仅仅对单词进行逆序。
本程序中:"i am a boy"依次为1,2,3个空格,我们很显然通过运行结果得到:
待优化处:
交换功能,可以不引入第三个变量,而是通过位操作即可完成。
0 0
- 给定一个字符串,按单词将该字符串逆序。
- 给定一个字符串,按单词将该字符串逆序
- 给定一个字符串,按单词将该字符串逆序。
- 将一个字符串按单词逆序
- 将一个字符串按单词逆序
- 将字符串按单词逆序
- 输入一个字符串,将字符串中的单词逆序输出
- 将字符串按照单词逆序
- 将字符串逆序打印和按单词逆序打印
- 将一个字符串逆序
- 将一个字符串逆序
- 将一个字符串逆序
- 给定字符串,将单词首字母改成大写
- 输入一个字符串,然后按逆序重新存放该字符串
- 字符串按单词逆序算法
- 字符串按单词逆序输出
- 按单词逆序打印字符串
- 字符串训练01—请编写一个C函数,该函数将一个字符串逆序
- MySql从命令行导入SQL脚本时,中文出现乱码
- java-String中的 intern()
- 迭代器模式(一)(遍历对象元素)
- 迭代器模式(二)(遍历对象元素)
- 色彩设计方法
- 给定一个字符串,按单词将该字符串逆序
- 代理模式(静态代理、jdk动态代理)
- Log4j和commons-logging的关系
- Linux 的“硬链接”与“软链接”
- 面向对象程序设计上机练习十(运算符重载)
- Linux /dev目录详解
- Linux挂载/卸载磁盘
- Hadoop还是Xen?
- linux 配置IP