您的位置:首页 > 其它

K&R 练习题 【每日一题】1-20

2013-05-28 08:23 302 查看
K&R的练习题偏难,但是个个题都是精华,建议先不管练习题,通读几遍,先记住基本的语法,再进行练习,练习时候如果感觉有难度,也可以先看答案,不过,一个题往往有多种解法,看完一种再自己思索下。

K&R 练习题 1-21

//write a program detab that replaces tabs in the input with the proper number of blanks to space to the next tab stop. Assume a fixed set of tab stops. say very n columns.

这个题目的意思,其实是自己定义tab的大小,并让字符按照定义tab的大小排列,比如输入 ab\tb\t, 如果定义tab为5, 则输出ab---b----,都整齐的按照tab定义大小排列。

小时候做数学题,不管会不会解,都要大大的写上一个解字有木有。恩。。。

解:

#include <stdio.h>

#define TABSIZE 10   // 定义一个tab为10个size
#define MAX_BUFFER 1000
#define SPACE '-' //为了显示方便,这里用‘-’ 代替空格‘ ’

int CaculatorTabLength(int l, int tabsize) //计算组成一个tab缺少的SPACE个数
{
return(tabsize - l%tabsize); //这儿取余数是这个算法的核心,耐心瞅瞅o(∩∩)o..
}

int mgetline(char s[], int lim)
{
   int c, i;
for(i = 0; i < lim-1 && (c=getchar())!=EOF && c!='\n';i++)
s[i] = c;
if(c == '\n')
{
s[i] = '\n';
i++;
}
s[i] = '\0';
return i;
}

int main(void)
{
int len;
char line[MAX_BUFFER];
while(len = mgetline(line,MAX_BUFFER))
{
int i,j,l,t;
for(i = 0, i = 0; i < len; i++)
{
if(line[i] == '\t')
{
j = CaculatorTabLength(l,TABSIZE);
for(t = 0; t < j; t++)
{
putchar(SPACE);
l++;
}
}
else
{
putchar(line[i]);
l++;
}
}
}
return 0;
}
这个程序的核心是取余计算,相似的题目:不使用printf 或者sprintf的情况下,让输入的字母以N个字符对齐输出。

[align=center]
[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: