空白格式化
时间: 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);
}
题目和答案均来自于互联网,仅供参考,如有问题请联系管理员修改或删除。