《C程序设计语言》读书笔记----习题1-21

题目就不写了,大概意思就是:尽量用制表符‘\t‘替换掉字符串中的空格。

同学们需要注意的是,打印一个制表符‘\t‘,其所占长度不是固定的。

这里要理解“制表符”和“制表符终止位”。“制表符”的作用是使得光标移动到下一个“制表符终止位”上。举个例子,假设制表符终止位是4、8、12、16......已经已经输入了10个字符,然后按一下Tab键,那么光标会移动到位置12上,同学们新建一个文本文档试一下就了解了。

这个题目看似简单,但是写一个简单、清晰的程序还是需要花一点脑筋的。

/*
这个程序看似简单,但是写一个简单、清晰的程序还是需要花一点脑筋的。
要去思考:什么情况下可以用一个‘\t‘代替空格?事实上只有一种情况,那就是:

  当一个“非空格字符”和该字符的下一个制表符终止位之间全部都是空格的时候,就可以用
  一个制表符‘\t‘替换这些空格

  例如:(用 _ 代表一个空格,用 | 表示制表符终止位,注意 | 并不是字符串的一部分)
  _ _ _ a b c _ _ | _ b c d f t q u r | _ d 

  能够用制表符替换的空格只有:(用 * 号 表示用制表符替换掉的空格)
  _ _ _ a b c * * | _ b c d f t q u r | _ d

*/

#include<stdio.h>

#define TABSTOP 8    //在Console中,制表符终止位一般是8,16,24,32......

int main()
{
    int total = 0; //已经读到的字符数
    int spaces = 0; //已经读到的空格数
    char c;          //当前读到的字符
    while ((c = getchar()) != EOF)
    {
        if (c != ‘ ‘)   //如果c不是一个空格
        {
            if (spaces == 0) //如果已经读到 0 个空格
            {
                putchar(c);
                ++total;
            }
            else   //c不是一个空格,但是读到的空格数 不等于 0
            {
                for (; spaces > 0; --spaces)//输出空格
                    putchar(‘ ‘);
                spaces = 0;                 //读到的空格数重新置为 0
                ++total;
                putchar(c);//输出当前读到的字符
            }
            if (c == ‘\n‘)
            {
                total = 0;
                spaces = 0;
            }
        }
        else //读了一个空格
        {
            ++total;
            ++spaces;

            int temp = (total-spaces) / TABSTOP;
            int nextLocation = (++temp) * TABSTOP;//下一个 制表符终止位
            if ( total< nextLocation)
                ;
            else//用‘\t‘填充空格
            {
                for (int i = 0; i < (nextLocation - (total-spaces)); i++)//为了明确输出的是‘\t‘,用*号比较直观。
                    putchar(‘*‘);
                //putchar(‘\t‘);
                spaces = 0;//读到的空格数重新置为 0
            }
        }
    }
    return 0;

}
时间: 2024-10-08 04:20:39

《C程序设计语言》读书笔记----习题1-21的相关文章

《C++primer》v5 第3章 字符串、向量和数组 读书笔记 习题答案

3.1略 3.2 string str; //读行 while(getline(cin,str)) cout<<str<<endl; //读单个词 while(cin>>str) cout<<str<<endl; 3.3 输入运算符读到空白符结束 getline读到换行符结束,并丢弃换行符 3.4 比较大小. 比较大小是比较的第一个不相同的字符的大小. int main() { string a,b; cin>>a>>b;

《C++primer》v5 第5章 语句 读书笔记 习题答案

5.1 空语句只有一个";".如果什么也不想做可以使用空语句. 5.2 用花括号{}括起来的叫块,也叫复合语句.有多条语句作用在同一个作用域时,需要用花括号括起来. 5.3 降低了. 5.4 (a)每次迭代时候会初始化iter,但是iter缺少初值,所以这段代码根本不会通过编译.另外这里的括号需要一个bool类型的,而定义迭代器根本不会返回一个bool类型.假如上面那些问题都可以通过,每次迭代都会初始化这个iter,会导致死循环. (b)我试了一下编译未通过是因为没找到适合的find函

《C++primer》v5 第4章 表达式 读书笔记 习题答案

4.1 105 4.2 *vec.begin()=*(vec.begin())//先调用点运算符,再解引用 *vec.begin()+1=(*vec.begin())+1//先解引用,再加一 4.3略? 4.4 (12/3*4)+(5*15)+(24%4/2)=91 4.5 (a)-86(b)-16 (c)0 (d)0 4.6 n%2 4.7 溢出:计算结果超出该数据类型所能表示的范围 2147483647+1 1U-2 ... 4.8 比较低.. 4.9 首先判断cp是否为空指针,若非空指针则

《JavaScript 高级程序设计》读书笔记二 使用JavaScript

一   <script>元素 a.四个属性: async:立即异步加载外部脚本: defer:延迟到文档完全被解析再加载外部脚本: src:外部脚本路径: type:脚本语言的内容类型: 二   XHTML中用法 a. //<![CDATA[ javascript代码 //]]> 三   <noscript>元素 <JavaScript 高级程序设计>读书笔记二 使用JavaScript

《Linux程序设计》&mdash;&mdash;读书笔记

UNIX是一套计算机操作系统应遵循的特定规范(定义了所有必需的操作系统函数的名称.接口和行为),完全符合该规范的操作系统才允许使用"UNIX"的商标,否则就是"类UNIX操作系统". 许多类UNIX系统都是商业性质的,如IBM的AIX,HP的HP-UX和Sun的Solaris:也有一些免费的,如FreeBSD和Linux. Linux是一个可以自由发布的类UNIX内核实现.发展之路:UNIX->Minix->Linux. Linux程序: Linux应用

《JavaScript高级程序设计》读书笔记--前言

起因 web编程过程使用javascript时感觉很吃力,效率很低.根本原因在于对javascript整个知识体系不熟,看来需要找些书脑补一下,同时欢迎众网友监督. 大神推荐书籍 看了博客大神们推荐的javascript书籍和推荐的阅读顺序,如下所示: 从头到尾对一遍<<Javascript高级程序设计>>,不懂的地方可以暂时掠过,给自己对javascript有一个大体的印象 认认真真的读完这本书:<<编写可维护的javascript>>,从编码规范,技巧,

《C++primer》v5 第2章 C++基础 读书笔记 习题答案

2.1 int,long long ,short 可表示范围和占用内存空间不同.具体与计算机有关. 无符号类型只能表示0和正数,带符号类型可以表示负数,0,正数. float是单精度,一般占用4个字节,double是双精度,一般占用8个字节,它们可表示的数据范围也不相同. 2.2 利率用double,本金和付款用int 2.3 unsigned u=10,u2=42; cout<<u2-u<<endl; cout<<u-u2<<endl; int i=10,

《C++primer》v5 第1章 开始 读书笔记 习题答案

从今天开始在博客里写C++primer的文字.主要以后面的习题作业为主,会有必要的知识点补充. 本人也是菜鸟,可能有不对之处,还望指出. 前期内容可能会比较水. 1.1略 1.2略 1.3 cin和cout分别是istream和ostream的对象. #include<iostream> using namespace std; int main() { cout<<"Hello,world"<<endl; return 0; } 1.4 #incl

《Linux程序设计》&mdash;&mdash;读书笔记(2)

Linux环境: 无论操作系统何时启动一个新程序,参数argc和argv都会被设置并传递给main(即使main函数未声明参数,此时只是不能使用这些参数).这些参数通常由另一个程序提供,一般是shell,它要求操作系统启动该新程序.shell会接受用户输入的命令行,将命令行分解成单词,然后把这些单词放入argv数组. 命令行参数在向程序传递信息方面很有用,很多工具程序使用命令行参数来改变程序的行为或设置选项(这一点我们很熟悉,但是可能很少会联想到正是argc.argv参数在这里发挥作用). 尽管

《JavaScript 高级程序设计》读书笔记一 简介

一   历史 二   实现 a. javascript三个部分: ECMAScript:由ECMA-262定义,提供核心语言功能: DOM:提供HTML的应用程序编程接口/提供访问和操作网页内容的方法和接口: BOM:提供与浏览器交互的方法和接口: 三   版本 <JavaScript 高级程序设计>读书笔记一 简介