思路:
我们可以这样理解题目,每隔n列就需要换一次行,但是字符数目不一定是n个,因为分割的位置是第n列之前的最后一个非空格之后(注意:这里是【最后一个非空格之后】,意思是从后往前的查看字符的时候遇到的第一个非空格字符,我看到网上有些代码貌似在这里理解出了问题),这样就可能会出现在第n列之前的结尾处有多个空格,如果是这样的话,这些空格就成为了下一行的字符。这里提到第n列所以需要把所有的\t都换位空格,以保证是按照列计算的。所以,我们需要把输入的字符都放入一个字符数组中,并将\t转换为空格。接下来,我们再对这个字符数组进行处理。每次处理,我们都会按顺序从中取出n个字符,并且对于没有使用的字符(就是结尾是空格的字符)放到下一行的字符中。
C语言实现代码:
#include<stdio.h> #define MAX_LEN 1000 #define TABLEN 8 #define SEPNUM 10 int 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; } }
备注:代码是按照自己对题意的理解来写的,如果哪里写的不对,还请多多指教~
原文:http://www.cnblogs.com/ningvsban/p/3775383.html