题目描述:
输入一行字符串,要求按下三个条件处理:
①.若连续多个空格则都缩减为一个。
②.每个单词第一个字母均大写。
③.数字与字母相连时加下划线(_)。
思路:
做这道题,先要选能读取空格的输入流,显然cin不可以,C++的getline和C的gets都可以用,
然后我先把字符串放在一个字符数组中,再用for循环一个一个调用,
每读取一个字符时,都要看看之前读取的字符是空格,数字还是字母,
然后再根据不同情况,将不同字符存到输出的字符数组中,
最后输出 输出的字符数组 即可。
源代码:
#include <iostream>
#include <stdio.h> // 用到gets函数,需要用这个
using namespace std;
int main()
{
char a[1000],b[1000]; //设置两个字符串数组,一个用来存输入的,另一个用来存输出的。
int i,j;
bool kg,zm,sz; //读取的变量 空格,字母,数字
// gets(a); //读取所输入的字符串:gets,getline 均可,用gets需要stdio头文件
cin.getline(a,1000); // PS:getline 用法: cin.getline(char a,int b,char c)
// :a为所需存进的字符数组,b为读取的个数,c为读到某个字符就停止,如果不填c,就默认读到回车。
j=0;
kg=false,zm=false,sz=false; //刚开始均设置为false
for(i=0;a[i]!='\0';i++) //开始读取字符
{
if(a[i]==' ') //如果读取的是空格,判断之前的读取是否为空格
{
if(kg==1)
continue;
else if(kg==0)
{
b[j]=' ';
j++;
kg=1;
}
sz=0;
zm=0;
}
else if(a[i]>='0'&&a[i]<='9') // 如果读取的为数字
{
if(zm==1)
{
b[j]='_';
b[++j]=a[i];
j++;
zm=0;
sz=1;
}
else
{
b[j]=a[i];
j++;
sz=1;
}
kg=0;
zm=0;
}
else if(a[i]>='a'&&a[i]<='z') //如果读取的为字母
{
if(i==0)
{
b[j]=char(a[i]-32);
j++;
zm=1;
continue;
}
if(kg==1)
{
b[j]=char(a[i]-32);
j++;
kg=0;
sz=0;
zm=1;
continue;
}
if(sz==1)
{
b[j]='_';
b[++j]=a[i];
j++;
sz=0;
zm=1;
}
else
{
b[j]=a[i];
j++;
zm=1;
}
kg=0;
sz=0;
}
}
b[j]='\0'; // 结束字符串
cout<<b<<endl;
return 0;
}
运行效果图: