练习1-22 编写一个程序,把较长的输入行折成短一些的两行或者多行,折行的位置在输入行的第N列之前的最后一个非空格之后。要保持程序能够智能地处理输入行很长以及在制定的列前没有空格或者制表符时的情况。
2013-10-25 23:11
881 查看
题目理解:自定义n为行的极限长度,输入行超过n列则进行折行操作,并且需要每列的开头不能是空格和制表符
例如n = 3 输入 aaaa 则输出 aaa
a
在有空格和制表符的情况输入 aaa空格空格制表符制表符a
输出 aaa
a(不带空格和制表符)。
我的答案:
View Code
达不到题目要求.看答案
对题目要求还不够理解透彻
题目要求的“要保持程序能够智能地处理输入行很长以及在制定的列前没有空格或者制表符时的情况” 答案貌似也没能够去掉多余的空格和制表符.
例如n = 3 输入 aaaa 则输出 aaa
a
在有空格和制表符的情况输入 aaa空格空格制表符制表符a
输出 aaa
a(不带空格和制表符)。
我的答案:
#include <stdio.h> #define LINEN 2 /*设置折行位置字符*/ main() { int c, pos; pos = 1;/*当前输入位置*/ while((c = getchar()) != EOF) if(c == ' ' || c == '\t') { putchar('\b'); }else if (c == '\n') { putchar(c); pos = 1; }else { putchar(c); ++pos; while(pos > LINEN){ putchar('\n'); putchar(c); break; } } return 0; }
View Code
达不到题目要求.看答案
#include <stdio.h> #define MAXCOL 3 /* maximum colum of input*/ #define TABINC 8 /* tab increment size*/ char line[MAXCOL]; /* input line*/ int exptab(int pos); int findblnk(int pos); int newpos(int pos); void printl(int pos); /*fold long input lines into two or more shorter lines*/ main() { int c, pos; pos = 0; /*position is the line*/ while ((c = getchar()) != EOF) { line[pos] = c; /* store current character*/ if(c == '\t') /* expand tab character */ pos = exptab(pos); else if (c == '\n') { printl(pos); /* print current input line */ pos = 0; }else if (++ pos >= MAXCOL) { pos = findblnk(pos); printl(pos); pos = newpos(pos); } } } /*printl: print line until pos column8*/ void printl(int pos) { int i; for(i = 0; i < pos; ++i) putchar(line[i]); if(pos > 0) /*any chars printed?*/ putchar('\n'); } /* exptab: expand tab into blanks */ int exptab(int pos) { line[pos] = ' '; /*tab is at least one blank */ for(++pos; pos < MAXCOL && pos % TABINC != 0; ++pos) line[pos] = ' '; if(pos < MAXCOL) /*room left incurrent line*/ return pos; else /* current line is full*/ { printl(pos); return 0; /* reset current position*/ } } /* findblnk : find blank's position*/ int findblnk(int pos) { while (pos > 0 && line[pos] != ' ') --pos; if(pos == 0) /*no blanks in the line ?*/ return MAXCOL; else /*at least one blank*/ return pos+1; /*position after the blank*/ } /*newpos: rearrange line with new position*/ int newpos(int pos) { int i, j; if(pos <= 0 || pos >= MAXCOL) return 0; /*nothing to rearrange*/ else { i = 0; for(j = pos ; j < MAXCOL; ++j) { line[i] = line[j]; ++i; } return i; /*new position in line*/ } }
对题目要求还不够理解透彻
题目要求的“要保持程序能够智能地处理输入行很长以及在制定的列前没有空格或者制表符时的情况” 答案貌似也没能够去掉多余的空格和制表符.
相关文章推荐
- 自己搞,带注释,适合初学者:C程序设计语言练习1-22 把较长的输入行折成短一些的两行或多行,折行的位置在输入行的第n列之前的最后一个非空格之后
- 编写一个程序,把较长的输入行“折”成短一些的多行,折行的位置在输入行的第N列之前的最后一个非空格之后
- 把较长的输入行折成短一些的两行或多行,折行的位置在输入行的第n列之前的最后一个元素。
- 练习1-21 编写程序entab,将空格串替换成最少数量的制表符和空格,但要保持单词之间的间隔不变。假设制表符终止位的位置与练习1-20的detab程序的情况相同。当使用一个制表符或者一个空格都可以到达下一个制表符终止位时,选用哪种替换字符比较好。
- 练习1-18 编写一个程序,删除每个输入行末尾的空格以及制表符,并删除完全是空格的行
- 练习1-20:请编写程序detab,将输入中的制表符替换成适当数目的空格,适空格充满到下一个制表符中止的地方。假设制表符终止位的位置是固定的,比如每隔n列就会出现一个制表符终止位。n应该作为变量还是符号常量呢?
- 【C语言】编写一个程序,从标准输入读取几行输入。每行输入都要打印到标准输出上,前面加上行号。编写这个程序的时候要使这个程序能够处理的输入行的长度没有限制。
- C语言 编写一个程序,从标准输入读取几行输入。每行输入都要打印到标准输出上,前面加上行号。在编写这个程序的时候要使这个程序能够处理的输入行的长度没有限制
- 【c语言】编写一个程序,从标准输入读取几行输入。每行输入都要打印到标准输出上,前面加上行号。在编写这个程序的时候要使这个程序能够处理的输入行的长度没有限制。
- 2. 编写一个程序,从标准输入读取几行输入。每行输入都要打印到标准输出上,前面加上行号。在编写这个程序的时候要使用让这个程序能够处理的输入行的长度没有限制
- 编写一个程序,从标准输入读取几行输入。每行输入都要打印到标准输出上,前面加上行号。在编写这个程序的时候要使这个程序能够处理的输入行的长度没有限制
- 练习 1-9 编写一个将输入复制到输出的程序, 并将其连续的多个空格用一个空格代替
- 练习1-10 编写一个将输入复制到输出的程序,并将其中的制表符替换为\t,把回退符替换为\b,把反斜杠替换为\\。
- C primer plus 第七章 练习2: 编写一个程序,该程序读取输入直到遇到#字符。使程序打印每个输入的字符以及它的十进制ASCII码。每行打印8个字符/编码对。
- 练习1-10 编写一个将输入复制到输出的的程序,并将其中的制表符替换成\t,把回退符替换成\b,把反斜杠\替换成\\,这样可以将制表符和回退符以可见的方式显示出来。
- 编写程序接收一个ASCII码(从0至128),然后显示输入ASCII码所代表的字符。 注意: (1)能够对1个或多个输入的ASCII码进行处理; (2)对于输入的非ASCII码进行判定和排除。
- 练习 1-20 编写程序 detab,将输入中的制表符替换成适当数目的空格,使空格充满到 下一个制表符终止位的地方。
- 编写一个程序把较长的输入行“折”成短一些的两行或多行
- 编写一个程序,删除每个输入行末尾的换行符和制表符,并删除完全是空格或制表符的行<The C Programming Language>课后习题
- 练习1-9 编写一个将输入复制到输出的程序,并将其中多个连续的空格用一个空格代替。