理解题意

  • 由于这道题一些地方没讲清楚(加粗的),导致一些问题。
  • 如果有一个地方为 '_'

    • 如果后面是小写字母,则把 '_' 去掉换成小写字母的大写形态。
    • 如果后面是大写字母,输出 $\texttt{ 'Error!'}$ 然后结束程序。
  • 如果有一个地方是大写字母,就把他转化为 '_' 和大写字母的小写形态。
  • 如果第一个字符是 '_' 或大写字母,输出 $\texttt{ 'Error!'}$ 然后结束程序。
  • 如果最后一个字符是 '_' ,输出 $\texttt{ 'Error!'}$ 然后结束程序。
  • 如果有几个连续的 '_' ,输出 $\texttt{ 'Error!'}$ 然后结束程序。
  • 如果同时出现大写字母和 '_',输出 $\texttt{ 'Error!'}$ 然后结束程序。

思路

  • 一个字符一个字符地枚举。
  • 用 $1$ 个变量来解决 '_' 后面是否小写字母判断问题。
  • 用 $2$ 个变量来解决 '_' 和大写字母同时出现的问题。
  • 最后再特判一下最后一个字符是不是 '_' 。

代码

#include<bits/stdc++.h>
#define Err {cout<<"Error!"<<endl;break;}//为了方便,用一个Err来代替“输出 'Error!' 然后结束程序。”的代码
using namespace std;
string s,ss; // s 代表输入的字符串, ss 则代表处理后的新的字符串
bool f,sxhx,sdx;// f 实现了思路中的第2条, sxhx && sdx 则实现了思路中的第3条。
int main(){
    while(cin>>s){
        ss="";sxhx=0;sdx=0;f=0;//初始化
        for(int i=0;i<s.size();i++){
            if(i==0 && (s[i]=='_' || (s[i]>='A' && s[i]<='Z'))) Err//判断第一个字符是不是 '_' 或大写字母
            else if(s[i]=='_'){// '_' 后面是否小写字母
                sxhx++;//下划线的个数加 1 
                if(s[i+1]=='_') Err//如果后一个字符还是 '_' ,输出 'Error!' 然后结束程序。
                else f=1;//否则将是否为 '_' 设为True,并在下一次判断
            }
            else if(f){//如果上一个字符是 '_'
                if(s[i]>='a' && s[i]<='z') ss+=char(s[i]-32);//如果合法,将其变为大写
                else Err//否则输出 'Error!' 然后结束程序。
                f=0;//归位
            }
            else if(s[i]>='A' && s[i]<='Z'){//如果是大写
                sdx++;//大写字母的个数加 1
                ss=ss+'_'+char(s[i]+32);//将其变为 '_'+小写
            }
            else ss+=s[i];//如果不是以上的特殊情况,什么都不干
            if(sxhx && sdx) Err//同时出现大写字母和 '_',输出 'Error!' 然后结束程序。
            if(i+1==s.size()){//如果已经枚举到了最后一个字符,准备输出
                if(!f) cout<<ss<<endl;//特判:如果最后一个字符不是 '_' 正常输出
                else Err//输出 'Error!' 然后结束程序。
            }
        }
    }
    return 0;
}
最后修改:2023 年 05 月 19 日
如果觉得我的文章对你有用,请随意赞赏