c:翻转一个长句中的每个单词
问题:
输入:“how are you baby-- "
输出:”woh era uoy --ybab "
#include<stdio.h>
#include<string.h>
#define SWAP(a,b) (a)^=(b);(b)^=(a);(a)^=(b) char* sentenceReverse(char* input){
if(NULL == input) return;
char *r,*f;
char *inp = (char*)malloc(sizeof(char)*(strlen(input)+));
//当input是const时其内容不能修改,此时需要在堆上new一个新数组;
strcpy(inp,input);
r=f=inp;
printf("input is:%s-----\n",inp);
char *rear,*front;//用于标记一个单词的词首和词尾
while(*r){
while(*r==' ') r++;
f=r;
while(*r!=' ' && *r!='\0') r++;
r--;
front=f;rear=r;
while(rear > front){//翻转一个单词
SWAP(*rear,*front);
front++;
rear--;
}
if(*(++r)=='\0') break;
}
return inp;
} int main(){
char test1[]="1oow lsije ";
char *test2="sdklf ";
char *ret2;
printf("test1 result is:%s-----\n",ret2=sentenceReverse(test1));
printf("test2 result is:%s-----\n",sentenceReverse(test2));
free(ret2);//free掉malloc开辟的空间
return ;
}
输出结果:
xu@xu-ThinkPad-X61:~/algorithm$ gcc sentenceReverse.c
xu@xu-ThinkPad-X61:~/algorithm$ ./a.out
input is:1oow lsije -----
test1 result is:woo1 ejisl -----
input is:sdklf -----
test2 result is:flkds -----
总结:
一,当函数参数是test2时(注意它声明时是char * 类型),内存做了以下操作:1.在堆上保存test2指针。2.将其内容:"sdklf "保存在“常量区”(具体我也不清楚,反正该区域内容不能修改)。找到下面连接,问题解释的比较清晰:
http://blog.chinaunix.net/uid-26456800-id-3262510.html
二,当函数sentenceReverse()对数组char *test2内容修改时,总会报错“
段错误 (核心已转储)”。
三,解决方案:在堆上重新开辟新空间进行操作。如上函数中新建数组inp[ ];
四,当函数参数是test1时(注意是它声明时是char [ ]类型)就不存在内存“段错误”问题。其内容存储在堆上可以直接修改。
深藏功与名!
c:翻转一个长句中的每个单词的更多相关文章
- NLP之Bi-LSTM(在长句中预测下一个单词)
Bi-LSTM @ 目录 Bi-LSTM 1.理论 1.1 基本模型 1.2 Bi-LSTM的特点 2.实验 2.1 实验步骤 2.2 实验模型 1.理论 1.1 基本模型 Bi-LSTM模型分为2个 ...
- js实现一个长页面中的图片懒加载即滚动到其位置才加载
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- java遍历统计一个文件夹中所有文件单词出现次数
思路就是通过递归进行文件遍历,把所有文件夹中的非目录文件都遍历一遍,并判断其中读取到的字符串是不是单词,并对单词进行记录和计数,并在最后进行排序输出,下面是代码: package word; impo ...
- Frogger POJ - 2253(求两个石头之间”所有通路中最长边中“的最小边)
题意 题目主要说的是,有两只青蛙,在两个石头上,他们之间也有一些石头,一只青蛙要想到达另一只青蛙所在地方,必须跳在石头上.题目中给出了两只青蛙的初始位置,以及剩余石头的位置,问一只青蛙到达另一只青 ...
- 经典算法面试题目-翻转一个C风格的字符串(1.2)
题目: Write code to reverse a C-Style String. (C-String means that "abcd" is represented as ...
- 解决 MySQL 比如我要拉取一个消息表中用户id为1的前10条最新数据
我们都知道,各种主流的社交应用或者阅读应用,基本都有列表类视图,并且都有滑到底部加载更多这一功能, 对应后端就是分页拉取数据.好处不言而喻,一般来说,这些数据项都是按时间倒序排列的,用户只关心最新的动 ...
- Android TV开发总结(七)构建一个TV app中的剧集列表控件
原文:Android TV开发总结(七)构建一个TV app中的剧集列表控件 版权声明:我已委托"维权骑士"(rightknights.com)为我的文章进行维权行动.转载务必转载 ...
- 一个在开源中国博客上讲解的AC自动机
原文出处:http://my.oschina.net/amince/blog/196426 原 荐 AC(Aho—Corasiek) 多模式匹配算法 摘要 如何在一篇文章中,搜索多个关键字,如何快速查 ...
- c语言经典算法——查找一个整数数组中第二大数
题目: 实现一个函数,查找一个整数数组中第二大数. 算法思想: 设置两个变量max1和max2,用来保存最大数和第二大数,然后将数组剩余的数依次与这两个数比较,如果这个数a比max1大,则先将max1 ...
随机推荐
- mysql_常用命令
1: 以指定编码创建数据库 CREATE DATABASE `search_data` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci
- ArcGIS网络分析之Silverlight客户端最近设施点分析(四)
原文:ArcGIS网络分析之Silverlight客户端最近设施点分析(四) 在上一篇中说了如何实现最近路径分析,本篇将讨论如何实现最近设施点分析. 最近设施点分析实际上和路径分析有些相识,实现的过程 ...
- Java经典23创意模式设计模式(两)
本文介绍5其余两种创意模式:模型构建器(Builder).原型模型(PROTOTYPE). 一.建造者模式(别名:生成者模式) 将复杂对象的构建和它的表示分离,使得相同的构建过程能够创建不同的表示. ...
- c/cpp中怎样切割字符串,相似于split的功能
在python中,假设要求当前时间的unix时间戳,我特别喜欢这么用: import time timestr = time.time() timestamp = int(timestr.split( ...
- 【百度地图API】如何用圆形搜索获取中心点周围100米内全部关键点?如天安门附近所有的餐厅、加油站、宾馆、大厦等
原文:[百度地图API]如何用圆形搜索获取中心点周围100米内全部关键点?如天安门附近所有的餐厅.加油站.宾馆.大厦等 摘要: 在LBS上有这样一个常用的功能,查找附近所有的关键点(POI点,比如标志 ...
- 只显示年月的js时间控件 纯手写
<style> #date { text-align: center; } .td { cursor: pointer; } </style> <script> f ...
- ssh ipv6
从这里学来的.http://blog.mattandanne.org/2012/01/sftpscp-and-ipv6-link-local-addresses.html当采用ipv6的地址去连接另外 ...
- ARC注意的泄漏问题
--------- block中常见的泄漏问题 代码中block经常用到.例如网络请求?一些图形分析处理等,就是比较耗时的操作,多线程gcd然后进行操作. 这个时候,会使用block进行处理,然后调用 ...
- C# Winform 界面线程的Invoke死锁,以及Application.DoEvent的问题
1.对于非界面线程来说,Invoke是把一个操作丢到界面线程的队列里,然后阻塞,等到这个操作被界面线程完成后,才继续后续操作.也就是说,Invoke是同步的. 问题来了,如果界面线程此时正在等待这个非 ...
- oracle 非数字型转数字型
原文:oracle 非数字型转数字型 oracle中如果一个字段内容不全是数字型 可以通过以下方式过滤 to_number(substr(translate(a.vital_signs_cvalues ...