编写程序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;
}
本周尝试用visual studio code 编译c程序,花费了不少时间,最后结合了几篇blog完成了。
主线是根据这篇blogVisual Studio Code 构建C/C++开发环境
3个插件,
- cpptools插件,
- code runner插件
- native debug 插件
这一步走了些弯路,我安装的是Cygwin。一开始以为跟普通软件一样安装,导致后面报了不少错,怎么设置参数都没用。 原来是C的编译命令都没装好。 具体安装参照windows 安装cygwin教程,这里面有两个重点步骤:
- 安装中需要选择下载网站,选择http://mirrors.aliyun.com/cygwin/, 先把这个网址add进去,再点“下一步”。这是阿里云的镜像地址,会加快一点下载速度。
- (划重点)安装中还有一个select packet界面。在这个界面下,有一个devel default子节点下,所有的包都是默认“skip”,即跳过不安装的。这其中有5个是我们需要的编译命令,需要手动选择。单击**‘skip’**,原来"skip"的位置会变成版本号,(单击一下默认最新的版本,也可以多点击几下看下其他的版本)。另外,其中有2个package的名字跟blog上有所不同(可能是版本原因)。原blog中的是以“gcc-mingw...”开头的两个包,改为“mingw64....”开头了。找的时候注意下。
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)中的配置。
经过这几个地方的调整后,可以运行调试了。