C语言----NOI /1.7 23 过滤多余的空格

总时间限制: 1000ms  内存限制:  65536kB

描述

一个句子中也许有多个连续空格,过滤掉多余的空格,只留下一个空格。

输入

一行,一个字符串(长度不超过200),句子的头和尾都没有空格。

输出

过滤之后的句子。

样例输入

Hello      world.This is    c language.

样例输出

Hello world.This is c language.

这里介绍两种解法,一种是我的解法,一种是网友的解法。

我的思路:

使多个连续的空格只被输出一次。

这道题和之前采用的去重输出的题目类似,只不过之前是对数字去重,现在是对空格去重,道理是一样的。就用一个if-else 语句,加上continue跳过,使空格只被输出一次就好啦。

代码如下:

int main()
{
	char s[200];
	int i;
	gets(s);
	for (i = 0;s[i] != '\0';i++) {
		if (s[i] == s[i+1] && s[i] == ' ')
			continue;
		else printf("%c", s[i]);
	}
	return 0;
}

这样就一个字符一个字符地输出了,得到了一个过滤后的句子!

网友的解法

是非常简洁的代码

思路是在循环内用scanf每次读取一个“单词”(这里用“单词”这个词来形容是方便理解!用样例来说就是Hello和world.This还有is还有c还有language.  就是没有被空格分开的那些“小部分”!!)

每读取一次就在“小部分”后带一个空格输出一次。

int main()
{
	char s[200];
	while(scanf("%s",&s)==1)//如果scanf成功读取一个字符串,它会返回1,所以循环会持续进行,直到没有更多的输入或者输入不是一个字符串。
		printf("%s ", s);
}

这样,就使每一个“单词”后都带了一个空格,每个“单词”间自然就只有一个空格啦!

同时,补充说明一个小点while(1)

“在C语言中,while(1) 创建了一个无限循环,因为条件 1 永远为真。这意味着循环体内的代码将不断地被执行,除非有某种方式(如 break 语句)来明确地跳出循环。”

对比两种解法:

前者是对连续空格进行处理,后者是从“单词”来处理。

前者用到了 去重输出,后者用到了scanf读取字符串的特点(它只会读取到下一个空白字符(如空格、制表符或换行符)为止)。

如果想看得更清楚的话,通过调试的功能,我们就能清楚地看到这两个程序的运行过程、体会二者的差异了。

第一种:

第二种:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值