#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 = ; errno = ; while ((read_size = fread(read_buf, sizeof (char), BUF_SIZE-, stdin)) >){
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 != ){
printf(strerror(errno));
} return ;
}

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

  1. 【代码笔记】iOS-浮点数处理并去掉多余的0

    一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. ...

  2. Birt设置导出格式和去掉多余按钮的方法

    1.设置导出格式: webcontent>birt>pages>dialog>ExportReportDialogFragment.jsp页面: 找到for ( int i = ...

  3. 删除字符串中多余的空白字符和空行(C语言实现)

    要求:处理一个字符串,删除字符串中多余的空格.水平制表符和空行,并满足下列要求: (1)对原字符串只能进行一次扫描.(2)不允许申请新的空间.(3)处理后的字符串的首尾不能有空格.制表符和空行.(4) ...

  4. .NET Core 发布时去掉多余的语言包文件夹

    用 .NET Core 3.x 作为目标框架时发布完之后,会发现多了很多语言包文件夹,类似于: 有时候,不想要生成这些语言包文件夹,需要稍微配置一下. 在 PropertyGroup 节点中添加如下的 ...

  5. DataGridView 去掉多余的列

    去掉DataGridView多余的列: this.DataGridView.AutoGenerateColumns = false;

  6. magento的url中 去掉多余的目录层级

    有时我们需要仅仅显示一层目录的URL路径.而不要出现多个路径的现实,我们可以用以下方法修改: Edit  /app/code/core/Mage/Catalog/Model/Url.php 找到632 ...

  7. mongodb转换List实体(去掉多余的字段) 批量添加

    Gson gson = new Gson(); String str = "list集合json字符串"; JsonObject object = gson.fromJson(st ...

  8. 正则匹配 去掉 多余的js和html标签

    $reg17 = '/><strong>公司介绍<\/strong><\/td>([\S\s*]+?)<\/div>/'; $this->d ...

  9. c 语言练习__求到N的阶乘的和。

    #include <stdio.h> /* 题目如下 * S = 1 + 2! + 3! + ... + N! */ int main(int argc, char *argv[]) { ...

随机推荐

  1. Excel快捷键

    Ctrl 组合快捷键 关键字 说明 Ctrl+PgDn 在工作表选项卡之间从左至右进行切换. Ctrl+PgUp 在工作表选项卡之间从右至左进行切换. Ctrl+Shift+& 将轮廓边框应用 ...

  2. iOS常见问题(5)

    一.注意将之前storyboard中控制器删除之后,拖入一个新的控制器的时候,stroyboard中控制器的class也要重新填入自己想要展示的控制器,告诉stroyboard去加载哪个控制器. 二. ...

  3. 二分查找or折半查找

    package com.gxf.search; /** * 测试折半查找or二分查找 * @author xiangfei * */ public class BiSearch { /** * 非递归 ...

  4. iOS10 关于推送-b

    最近在研究iOS10关于推送的新特性, 相比之前确实做了很大的改变,总结起来主要是以下几点: 推送内容更加丰富,由之前的alert 到现在的title, subtitle, body 推送统一由tri ...

  5. 从状态转移看:载波侦听多路访问/冲突避免(CSMA/CA)

    CSMA/CA是写入IEEE802.11的无线网络MAC层标准协议,相信看到这篇文章的读者都知道它是用来做什么的.但许多短文对这个协议的解释都有所缺乏,因此本文用状态转换图的形式详细说明协议的工作流程 ...

  6. 2005: [Noi2010]能量采集 - BZOJ

    Description 栋栋有一块长方形的地,他在地上种了一种能量植物,这种植物可以采集太阳光的能量.在这些植物采集能量后,栋栋再使用一个能量汇集机器把这些植物采集到的能量汇集到一起. 栋栋的植物种得 ...

  7. PHP 中的BOM BUG

    对于PHP,一个小小让我不敢置信的事情很多,包括引用变量哪么迟钝,普通变量哪么牛B我己经很意外,甚至现在竟然出现了BOM头的BUG. 在PHP中,会引用很多小文件,include或require,哪么 ...

  8. CI_Autocomplete_2.0.php轻松实现Bebeans与Codeigniter的智能提示

    在你的NetBeans项目下建立一个CI_Autocomplete_2.0.php的文件,粘贴以下代码:(codeigniter太旧了,其实性能不行,应该没人更了,换了吧,别学这玩意了,坑人) < ...

  9. BZOJ 2753 [SCOI2012] 滑雪和时间胶囊 最小生成树

    题目链接: 题目 2753: [SCOI2012]滑雪与时间胶囊 Time Limit: 50 Sec Memory Limit: 128 MB 问题描述 a180285非常喜欢滑雪.他来到一座雪山, ...

  10. 【转载】Spring加载resource时classpath*:与classpath:的区别

    免责声明:     本文转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除.     原文作者:kyfxbl     原文地址: spring配置中classpath和cla ...