总时间限制: 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读取字符串的特点(它只会读取到下一个空白字符(如空格、制表符或换行符)为止)。
如果想看得更清楚的话,通过调试的功能,我们就能清楚地看到这两个程序的运行过程、体会二者的差异了。
第一种:
第二种: