Skip to content

Latest commit

 

History

History
96 lines (81 loc) · 4.75 KB

2018-07-05.md

File metadata and controls

96 lines (81 loc) · 4.75 KB

1.Algorithom

编写程序detab,将输入中的制表符替换成适当数目的空格,是空格充满到下一个指标符终止位的地方。假设制表符终止位的位置是固定的,比如每隔n列就会出现一个制表符终止位。n应该是作为变量还是符号常量呢? 这是《C程序设计语言》(第2版)的1-20题。

#include <stdio.h>

#define TABINC 10  //every N bit has a tab terminal bit.

int main(int argc, char const *argv[])
{
    int c;
    for(int i=1;(c=getchar())!=EOF;i++){
        if(c=='\t'){
            putchar(' ');
            while(i%TABINC!=0){
                putchar(' ');
                i++;
            }
        }else if(c=='\n'){
            i = 0;
        }else 
         putchar(c);
        
    }
    return 0;
}
  • 参考了下答案,大部分逻辑相同。可以优化的地方在于,既然是用空格填充,则有一个变量nb来记录每次碰到tab符时应该填充的空格数,再用nb--来循环打印出空格,代码思路会比较清晰
  • 在这个习题中发现,原来在C的控制命令行中,键入tab并不是一个固定的宽度,而是按每8位来补齐空格。 比如说,在一行的开头键入tab,则tab占8个空格;输入3个字符后再键入tab,则tab占5个空格, 如果已经有7个字符了,则tab只占一个空格,难怪题目说有每8位存在一个制表符终止符。说的就是这个意思。

用变量nb记录应填充的空格数,优化代码如下:

#include <stdio.h>

#define TABINC 10  //every N bit has a tab terminal bit.

int main(int argc, char const *argv[])
{
    int c,nb;
    nb = 0; //the number of blank 
    for(int i=1;(c=getchar())!=EOF;i++){
        if(c=='\t'){
            nb = TABINC - (i -1)%TABINC ;
            while(nb){
                putchar(' ');
                nb--;
                i++;
            }
        }else if(c=='\n'){
            i = 0;
        }else 
         putchar(c);
        
    }
    return 0;
}

2.Review

3.Tips

本周尝试用visual studio code 编译c程序,花费了不少时间,最后结合了几篇blog完成了。

主线是根据这篇blogVisual Studio Code 构建C/C++开发环境

step 1 Visual Sutdio Code以及CC插件安装,参照blog即可.

3个插件,

  1. cpptools插件,
  2. code runner插件
  3. native debug 插件

step 2 安装GCC工具链

这一步走了些弯路,我安装的是Cygwin。一开始以为跟普通软件一样安装,导致后面报了不少错,怎么设置参数都没用。 原来是C的编译命令都没装好。 具体安装参照windows 安装cygwin教程,这里面有两个重点步骤:

  1. 安装中需要选择下载网站,选择http://mirrors.aliyun.com/cygwin/, 先把这个网址add进去,再点“下一步”。这是阿里云的镜像地址,会加快一点下载速度。
  2. 划重点)安装中还有一个select packet界面。在这个界面下,有一个devel default子节点下,所有的包都是默认“skip”,即跳过不安装的。这其中有5个是我们需要的编译命令,需要手动选择。单击**‘skip’**,原来"skip"的位置会变成版本号,(单击一下默认最新的版本,也可以多点击几下看下其他的版本)。另外,其中有2个package的名字跟blog上有所不同(可能是版本原因)。原blog中的是以“gcc-mingw...”开头的两个包,改为“mingw64....”开头了。找的时候注意下。

step 3 在visual studio code 中配置launch.jsontasks.json的文件

include语句报错的情况,参考【解决】VSCode在windows下不能打开标准头文件. windows下的路径添加位置在msvc-x64

"intelliSenseMode": "msvc-x64",
"browse": {
"path": [
"X:/LinuxC_Include",
"${workspaceRoot}"
],

tasks.json文件中,原blog在"args"参数里面写死了“hello.exe”,建议将"${workspaceRoot}/hello.exe"改成"${workspaceRoot}/${fileBasenameNoExtension}.exe"launch.json 也有类似的,没有了博主提到的“target”,而是将program参数改成"program": "${workspaceRoot}/${fileBasenameNoExtension}.exe",另外,其中的 "miDebuggerPath"参数要改成自己的gdb命令所在路径(第二步里安装的路径)如"miDebuggerPath": "C:\\cygwin64\\bin\\gdb.exe" 。(注意是两个反斜杠) 这两个参数设置是参考整理:Visual Studio Code (vscode) 配置C、C++环境/编写运行C、C++(Windows)中的配置。

经过这几个地方的调整后,可以运行调试了。

4.Share