题目描述
一个句子中也许有多个连续空格,过滤掉多余的空格,只留下一个空格。
输入
一行,一个字符串(长度不超过200)。
输出
过滤之后的句子。首尾的空格要去掉,中间的连续多个空格要换成1个空格。
样例输入 复制
Hello world. This is c language.
样例输出 复制
Hello world. This is c language.
提示
scanf只能一个一个读单词,不读空格,while(scanf("%s".&st)==1)的功能是循环读入数据,在读不到的时候停止循环。
也可以使用gets读取一行字符串。
解法1(最优解) :
解题思路:利用scanf()函数自动屏蔽空格回车的特性
#include<iostream>
using namespace std;
char st[200];
int main(){
while (scanf("%s",&st)==1)
cout<<st<<" ";
return 0;
}
解法二:
利用逻辑思维
#include<bits/stdc++.h>
using namespace std;
int main()
{
char str[250];
int i;
int len;
fgets(str,250,stdin);
len = strlen(str);
for(i = 0 ; i < len ; i++)
{
if(str[i]==' '&&str[i+1] == ' ')
{
continue;
}
printf("%c",str[i]);
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
string s;
char c;
int len;
int flag = 0;
int main()
{
getline(cin , s);
len = s.size();
for( int i = 0,j = 1; i< len ; i++,j++)
{
while(s[i] == ' '&&s[j] == ' '||s[i]=='\n'&&s[i] == ' '||s[i]==' '&&s[i]=='\n')
{
flag = 1;
j++;
}
if(flag)
{
for( int k = i+1; k<j;k++)
{
s[k] = '\0';
}
i = j;
j++;
flag = 0;
}
}
for(int i = 0; i< len ;i++)
if(s[i]!='\0') cout<< s[i];
cout << endl;
return 0;
}