#include <stdio.h>
#include <string.h>
#include <errno.h>#define BUF_SIZE 128
/** 要求:处理一个字符串,删除字符串中多余的空格、'\t'和空行,并满足下列要求:*    (1)对原字符串只能进行一次扫描。*    (2)不允许申请新的空间。(这个有点疑问,声明变量也会申请空间的。)*    (3)处理后的字符串的首尾不能有空格、'\t'和空行。*    (4)如果原字符串中连续出现空格和'\t',则处理后的字符串只需存储一个空格。*    (5)如果原字符串中连续出现空格、'\t'和空行,则处理后的字符串只需存储一个空行*    (对这个空行理解也不清楚是一个\n,还是两个\n?,字符串后两个\n才会出一*     个可见的空行,这个地方可能是 \n 我以为)。*    *    这个题花了我两个小时,写了三遍。*    总结:    1.对问题的理解很重要.*        2.把问题转换成合理的模型,可以减少许多工作.*        3.每个局部都正确,不代表整体有意义.**    这个题的处理模型就是字符串拷贝。*    但有条件.就是上面说的,转换成程序是这样的。。。。看代码吧,*    写的注释都多余.*    *    关于 bug 为何不直接修正,因为我看人家都只给的函数。*//** FIXME: 如果修正bug 的话,这里将会修改成* -----------* char remove_extra_space(char *str, int is_trim_header)* -----------*/
void remove_extra_space(char *str)
{char *s = str;    //代表生成的字符串,因为 s 多表示临时字符串。char *prv = NULL;    //代表上一个有效的字符.这个有效的是指...(你应该明白的)for(; prv==NULL ||*prv != '\0'; ++str){    //这个的好处在于 不会遗忘掉 ++str.而且 continue 后还能执行.        switch (*str){case '\t': *str = ' ';    //方便统一处理.因为结果都是空格case ' ' :/** FIXME: 如果修正bug 的话,这里将会修改成* -----------* if ( (prv == NULL && is_trim_header != 0) || *prv == '\n' || *prv ==' '){* -----------*/if (prv == NULL || *prv == '\n' || *prv ==' '){continue;}break;case '\0':            case '\n':    if (prv == NULL){/** FIXME: 如果修正bug 的话,这里将会修改成* -----------* if (*str == '\n' && is_trim_header != 0)                * -----------*/if (*str == '\n')                continue;}else if ( *prv == ' ' || *prv == '\n'){*prv = *str;    /** FIXME:这个地方获取返回值,返回值初始值 '\0'    */               continue;}break;}if (s != str){*s = *str;}prv = s;++s;}
        /** FIXME: 返回返回值.*/}int main(int argc,char *argv[]){char read_buf[BUF_SIZE] = {'\0'};int read_size = 0;errno = 0;while ((read_size = fread(read_buf, sizeof (char), BUF_SIZE-1, stdin)) >0){read_buf[read_size] = '\0';/* * FIXME:注意这个地方有 bug, 读取文件被分成 BUF_SIZE 的小块,* 如果刚好在有空格(或 '\t' )处分割,则会缺少个空格.* 如果在换行前分割,会丢失换行.* 解决放案是传入个 int is_trim_header (是否消除字符串开始处的空白或换行);* 如果 is_trim_header 不为 0 则 不保留开始处的空格,* 为 0 则 按照空格是出现在句子中间或末尾的情况处理.* * 这里要判断行上次行末,和这次行首是否有空白符用来确定 is_trim_header 的值.* 这里还需要 remove_extra_space 返回读到 \0 时删掉的字符,才能确定如何补偿* 空格还是回车** *  if (上行删掉的是\n && 本行有内容) 补偿 \n,is_trim_header = 1;*  else if (上行删掉的是' ' && 本行有内容)  is_trim_header = 0;*  else is_trim_header = 1;*/remove_extra_space(read_buf);printf("%s",read_buf);}if (errno != 0){printf(strerror(errno));}return 0;    }

转载于:https://www.cnblogs.com/playerc/p/3217355.html

c 语言练习__去掉多余的空白字符_修正相关推荐

  1. C语言scanf缓冲区去掉多余回车键

    #include<stdio.h>int main(){int i;scanf("%d",&i);printf("i=%d\n",i);ch ...

  2. jsoncpp去掉多余字符_Python超详细的字符串用法大全

    本文要点 字符串拼接 拆分含有多种分隔符的字符串 判读字符串a是否以字符串b开头或结尾 调整字符串中文本的格式 对字符串进行左,右,居中对齐 删除字符串中不需要的字符 字符串拼接 实际场景:把列表中的 ...

  3. php 去掉无关数据,php 读取 mysql 表中的double数据,去掉多余的0

    php 读取 mysql 表中的double数据,去掉多余的0 mysql 中有 ttt 表结构和数据如下 CREATE TABLE `ttt` ( `id` int(11) NOT NULL AUT ...

  4. springBoot项目启动去掉多余的启动日志

    springBoot项目启动去掉多余的启动日志: 因为在 LoggingApplicationListener 中设置了项目的日志等级为 level , 在项目的yml文件中添加一行代码 loggin ...

  5. Ubuntu 10.04下fcitx输入法中去掉多余的输入方式

    Ubuntu 10.04下fcitx输入法中默认存在11种输入方式,包括:智能拼音.智能双拼.区位.五笔字型.五笔拼音.二笔.仓颉.晚风.冰蟾全息.自然码和电报码.不过对于普通用户来说,常用的输入方式 ...

  6. 如何抠图去掉多余部分?这些方法get过吗

    很多使用过抠图的小伙伴应该都会遇到过在抠图过程中经常会选取到多余的范围,即便是一些工具带有自动抠图功能,由于一些颜色的差距不是很明显导致会误判抠图的识别导致多出一截不想要的画面,如果手动的话使用鼠标选 ...

  7. 问题 I: 4.18 join、split  删除字符串s=‘zzz xx y u v w ttt ‘中多余的空白字符,如果有连续多个空白字符,只保留一个。

    问题 I: 4.18 join.split 时间限制: 1 Sec 内存限制: 128 MB 提交: 3507 解决: 2657 [提交] [状态] [讨论版] [命题人:wangbs] 题目描述 4 ...

  8. 您知道Linux下C语言编程的一些注意事项吗_教育中国

    您知道Linux下C语言编程的一些注意事项吗_教育中国 云风的 BLOG: 一个 C 接口设计的问题 一个 C 接口设计的问题 C 语言在本质上,参数传递都是值传递.不像 Pascal 和 C++ 可 ...

  9. python表示整除的符号_c语言中整除符号怎么表示?_后端开发

    c语言fun函数有什么例题?_后端开发 c语言fun函数例题有:1.fun函数表示计算x的y次幂,代码为[for(int i=1;i<=y;i++)result*=x]:2.fun函数交换两个指 ...

最新文章

  1. 【PHPWord】页面添加图片水印
  2. js全局变量和局部变量
  3. Unity --- MeshRenderer之网格合并
  4. MySQL学习笔记之五:存储引擎和查询缓存
  5. 《GO并发编程实战》—— 临时对象池
  6. umi+Ant Design Mobile+rem搭建移动端H5框架
  7. 考研基础高等数学笔记
  8. 2022-2028全球与中国海港和机场安检系统市场现状及未来发展趋势
  9. 实验一 网络侦查与网络扫描
  10. ConstraintLayout实现左中右布局
  11. 洛谷P4315 月下“毛景树”(树剖+线段树)
  12. Numpy 中的矩阵向量乘法
  13. 计算机模拟人脑的智能行为叫,模拟人脑结构方可实现强人工智能目标
  14. 百度地图搜索、标注地图示例
  15. 武汉大学 计算机学院周陌,计算机学院:披荆斩棘敢于拼 考研科班夺战绩
  16. 【毕业生】外包公司适合你么?
  17. MATLAB读ArcGIS输出的dbf文件
  18. 软件测试证书(2)— 计算机二级证书
  19. 干货分享!通过图片提升UI设计作品格调的3个方法
  20. Ulink2 与 Jlink

热门文章

  1. 当期收益率(Current Yield)
  2. Oracle 多行合并一行 方法
  3. redis 本机链接服务端命令
  4. lamp环境搭建经验总结
  5. SDOI 2006 - 保安站岗
  6. 改变背景色为苹果绿--保护眼睛
  7. datagrid中使用dropdownlist编辑模版时遇到问题
  8. 冒泡、选择、插入排序算法
  9. 第二节 -- python的基础语法
  10. webconfig中注册HttpHandler报错:检测到在集成的托管管道模式下不适用的 ASP.NET 设置。...