- 题目来源:《The C programming language》中的习题
- 练习1-22:编写一个程序,把较长的输入行‘折’成短一些的两行或者多行,折行的位置在输入行的第n列之前的最后一个非空格之后。要保证程序能够智能地处理输入行很长以及在指定的列前有空格或制表符时的情况。
思路:
我们可以这样理解题目,每隔n列就需要换一次行,但是字符数目不一定是n个,因为分割的位置是第n列之前的最后一个非空格之后(注意:这里是【最后一个非空格之后】,意思是从后往前的查看字符的时候遇到的第一个非空格字符,我看到网上有些代码貌似在这里理解出了问题),这样就可能会出现在第n列之前的结尾处有多个空格,如果是这样的话,这些空格就成为了下一行的字符。这里提到第n列所以需要把所有的\t都换位空格,以保证是按照列计算的。所以,我们需要把输入的字符都放入一个字符数组中,并将\t转换为空格。接下来,我们再对这个字符数组进行处理。每次处理,我们都会按顺序从中取出n个字符,并且对于没有使用的字符(就是结尾是空格的字符)放到下一行的字符中。
C语言实现代码:
#include<stdio.h>
#define MAX_LEN 1000
#define TABLEN 8
#define SEPNUM 10int getCol(char charArr[MAX_LEN],int start,int index);
//主函数
void main(){
int c,i,index,nbs,pos;
char charArr[MAX_LEN];
index=0;
nbs = 0;
while((c=getchar())!=EOF && c!=‘\n‘){
if(c==‘\t‘){ //制表符替换为空格
nbs = TABLEN-(index+1)%TABLEN;
for(i=0;i<=nbs;i++){
charArr[index]=‘ ‘;
index++;
}
}else{
charArr[index]=c; //保存字符
index++;
}
}
index--;
pos=0;
while(pos<=index){
pos = getCol(charArr,pos,index);
}}
//该函数用于获取n个字符,并输出最后一个非空字符(包括该字符)之前的字符,返回紧跟该非空字符之后的空格的位置
int getCol(char charArr[MAX_LEN],int start,int index){
int end,pos,i,tmp;
tmp = start+SEPNUM-1;
pos = 0;
if(tmp>index){
end = index;
}else{
end = tmp;
}
for(i=end;i>=start;i--){
if(charArr[i]!=‘ ‘){
pos = i;
break;
}
}
if(pos>0){
for(i=start;i<=pos;i++){
putchar(charArr[i]);
}
putchar(‘\n‘);
return pos+1;
}else{ //该n个字符全部为空格的情况
return end+1;
}
}
备注:代码是按照自己对题意的理解来写的,如果哪里写的不对,还请多多指教~