空白格式化

空白格式化

时间: 1ms        内存:128M

描述:

恭喜你进入了蓝桥杯总决赛,本次大赛采用了全自动机器测评系统。

如果你的答案与标准答案相差了一个空格,很可能无法得分,所以要加倍谨慎!

    但也不必过于惊慌。因为在有些情况下,测评系统会把你的答案进行“空白格式化”。其具体做法是:去掉所有首尾空白;中间的多个空白替换为一个空格。所谓空白指的是:空格、制表符、回车符。

    以下代码实现了这个功能。仔细阅读代码,填写缺失的部分,并补充完整使其能够工作。

void f(char* from, char* to)

{

       char* p_from = from;

       char* p_to = to;    

       while(*p_from==' ' || *p_from=='\t' || *p_from=='\n') p_from++;      

       do{

              if(*p_from==' ' || *p_from=='\t' || *p_from=='\n'){

                     do{p_from++;} while(*p_from==' ' || *p_from=='\t' || *p_from=='\n');

                     if(____________________) *p_to++ = ' ';  //填空位置

              }

       }while(*p_to++ = *p_from++);

}

输入:

一行代码,不是标准格式。

输出:

输出代码的标准形式。

示例输入:

      char*        p_from =     from;    

示例输出:

char* p_from = from;

提示:

参考答案(内存最优[800]):

#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
	void f(char* from, char* to);
	char pf[1000],pt[1000];
	char *pff=pf,*ptt=pt;
	while(scanf("%s",pf)!=EOF)
	{
	f(pff,ptt);
	printf("%s ",pt);
	}
	printf("\n");
	return 0;
}
void f(char* from, char* to)

{

       char* p_from = from;//对指针赋值,其中p_from为开始 

       char* p_to = to;     //p_to 为结束 

       while(*p_from==' ' || *p_from=='\t' || *p_from=='\n') 
	   p_from++;       //第一个字符,当指针所指为空格或tab或换行 
       do{
				//当指针所指内容为空格或tab或换行,指针向后移动
				//如果不为 空格或tab或换行,p_to=p_from,后两者均向后移动 
              if(*p_from==' ' || *p_from=='\t' || *p_from=='\n')
			  { 
                     do{p_from++;} 
					 while(*p_from==' ' || *p_from=='\t' || *p_from=='\n');
					 //当指针所指内容为空格或tab或换行,指针向后移动 
                     if(*p_from!=' '&&*p_from=='\t' && *p_from=='\n') *p_to++ = ' ';
						//当指针内容不为空时,令p_to指针记录p_from 的地址 
              }

       }while(*p_to++ = *p_from++);//当p_to不为空时循环 

}

参考答案(时间最优[0]):

#include <iostream>
using namespace std;
#include <stdio.h>
#include <string.h>
void f(char* from, char* to)
{
    char* p_from = from;
    char* p_to = to;
    while(*p_from==' ' || *p_from=='\t' || *p_from=='\n') p_from++;//先判断开头的' ','\t','\n'的请扩,把所有这些可能都跳过;
    do
    {
        if(*p_from==' ' || *p_from=='\t' || *p_from=='\n')//然后判断中间的,如果遇到了,就一直继续把所有连在一起的消除成一个。
        {
            do
            {
                p_from++;
            }
            while(*p_from==' ' || *p_from=='\t' || *p_from=='\n');
            if(*p_from!='\n') *p_to++ = ' ';  //填空位置
        }
    }
    while(*p_to++ = *p_from++);
}

int main()
{
    char a[100];
    gets(a);
    f(a,a);
    puts(a);
}

题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。

点赞

发表评论

电子邮件地址不会被公开。必填项已用 * 标注