前前后后在HD上做了不少有关字符串处理的题目了。1088要算是另一朵奇葩。写写心得,贴下代码。
首先,要解决的是数据如何输入的问题。测试实例只有一组,很大的一组吆。包括字母,数字,标点符号和空格。其中<br>和<hr>具有特殊意义,并且每行最多输出
80个字符也是要注意的。那么,用什么方式来输入数据呢?理论上讲,cin,gets(),getline()等都应该是可以的。我就是先用了gets(),测试完全对,结果WA了N遍,无
奈换成 cin,一遍AC了。其次,处理后的结果怎么存储。我就开了一个大数组,将输入数据的对应结果存储起来。当然,还用used来记录每行已存储的数。将所有的信息
都存到数组中,最后只要输出数组即可了。再次,可能还要注意的是每个单词必须在同一行输出、每行开头无空格、每行每两个单词间有一个空格。
最开心的是自己在这一题上进一步了解了指针、数组、转义字符。比如,我在char *p=0和char *p=NULL,是一样的,因为C++系统中已定义#define NULL 0。
还有,char ch[10],赋值ch[5]=0和ch[5]='\0'效果相同。可笑的是,我的程序中出现了p=0,然后p++。导致纠结了半天,还好已经了解了!
AC代码:
#include<iostream>
#include<string>
using namespace std;
int main()
{
char a[100],b[10000];
int i=0,used=0;
while(cin>>a)
{
if(strcmp(a,"<br>")==0)
{
b[i++]='\n';
used=0;
continue;
}
if(strcmp(a,"<hr>")==0)
{
if(used!=0)
b[i++]='\n';
for(int j=0;j<80;j++)
b[i++]='-';
b[i++]='\n';
used=0;
continue;
}
int len=strlen(a);
if(len+1+used>80)
{
b[i++]='\n';
for(int j=0;j<len;j++)
b[i++]=a[j];
used=len;
}
else
{
if(used!=0)
b[i++]=' ';
for(int j=0;j<len;j++)
b[i++]=a[j];
used+=len+1;
}
}
b[i]=0;
cout<<b<<endl;
return 0;
}