字符串处理之文本规范化

   凌晨睡不着觉了,起来撸会代码。华科的一个复试上机题,题型还是字符串处理,只不过这次活细点,自己想了一种解法,又在博客上看到了别人的一种解法,理解了一下别人的思路,两种思路最后都ac了,不过感觉自己的思路钻了OJ输入的一个空子,省去了对回车的判定。这篇文章就把这两种解法整理一下。
文本规范化
时间限制: 1 Sec  内存限制: 128 MB
题目描述
字符串是计算机经常处理的对象。现在有多行文本,文本中只包含小写字母、空格,数字和回车,不存在空行或者全部为空格的行。我们需要将这段文本规范化。要实现下面三个要求:(1)去掉每行的行首多余空格(2)
如果单词中间有多个空格,我们只保留一个空格(3)如果数字和字母相邻,需要在他们之间加下划线'_'。
输入
输入多行上述文本,每一行文本字符不超过100个。为了方便查看空格,空格用#代替
输出
输出满足上面要求的文本,空格用#代替
样例输入
##you#are#boy
you##am#girl
###a40b##c
样例输出
you#am#boy
you#am#girl
a_40_b#c
提示
来源
2016华中科技大学计算机复试

思路一:
  用scanf("%s")一次读入一行的输入方式(scanf遇到回车结束,不用判断'\n'这个字符):
  1:先考虑是不是开头的,如果是开头的空格,无论多少个#都不输出
  2:不是开头空格的话,看看该空格前面是否有空格,如果前面有的话也不输出
  3:如果是字母的话,看看前面是否是数字,先输出一个下划线,再将数字字母输出
  4:如果是字母的话,看看前面是否是数字,是数字的话加上一个下划线之后再输出.
AC代码:
#include
#include
#include
#define maxn 105
using namespace std;
char str[maxn];
int main(){
	
	while(scanf("%s",str)!=EOF){
		char before = 0,cur=0;
		bool isprint = true,isfirst=true;
		
		for(int i=0;i

 
    
 
   
思路二(参考)
   用一次读入一个字符的方法,这种解法就不是每次处理一行文本了,而是拿着输入的多行字符文本一块处理,每次处理一个字符,这个时候就必不可 少的要处理每行结尾的回车符号了
AC代码:
#include
#include
#include
using namespace std;
int main(){
	char befor=0,cur=0;
	bool isfirst=true, isprint = true;
	while(scanf("%c",&cur)==1){
		isprint= true; //每次在输出之前,将输出支 
		if(cur=='#')
		{  //如果是空格的情况
			if(isfirst)
			{
				isprint=false;
			} 
			else if(befor=='#')
			{
				isprint=false;
			}
		}
		else if('a'<=cur && cur<='z') {	// 字母
			if('0'<=befor && befor<='9') printf("_");	// 字母和数字间插入一个空格
			isfirst = false;
		} else if('0'<=cur && cur<='9') {	// 数字
			if('a'<=befor && befor<='z') printf("_");  	// 字母和数字间插入一个空格
			isfirst = false;
		} else if(cur=='\n') {	// 换行
			isfirst = true;
		}
		if(isprint) printf("%c", cur);
		befor = cur;
	}
	
	
}






你可能感兴趣的:(#,其它)