小学生又来写题解啦!
本题显然是字符串模拟,认真维护好每个要求即可。
首先先判断是情况一还是情况二,如果同时出现,输出报错信息。
我们可以用一个函数实现上述功能。
若是情况一,枚举下划线位置,再加以判断是否报错。
若是情况二,枚举大写字母位置。
若什么情况都不是,直接输出原字符串。
其中关于报错的细节在代码中会说明。
满分代码:
#include <iostream>
#include <cstdio>
using namespace std;
string s;
int len;
int find_op() //寻找属于哪种情况。
{
bool a = false, b = false;
for (int i = 0; i < len; i++)
if (s[i] == '_') //有情况一。
{
a = true;
break;
}
for (int i = 0; i < len; i++)
if ('A' <= s[i] && s[i] <= 'Z') //有情况二。
{
b = true;
break;
}
if (a && b) return -1; //情况共存,爆掉。
if (a) return 1;
if (b) return 2;
return 3; //啥情况都没有。
}
void calc(int t)
{
if (t == -1)
{
printf("Error!\n");
return;
}
else if (t == 1)
{
if (s[0] == '_' || s[len-1] == '_') //若首尾是下划线,爆掉。
{
printf("Error!\n");
return;
}
string ans = "";
for (int i = 0; i < len; i++)
{
if (s[i] == '_')
{
if ('a' <= s[i+1] && s[i+1] <= 'z') //后一个得是小写字母。
{
ans += s[i+1] - 'a' + 'A';
i++; //作用为跳过下一个字符。
}
else
{
printf("Error!\n"); //不是小写字母,爆掉。
return;
}
}
else ans += s[i];
}
cout << ans << endl;
}
else if (t == 2)
{
if ('A' <= s[0] && s[0] <= 'Z') //首位是大写字母,爆掉。
{
printf("Error!\n");
return;
}
for (int i = 0; i < len; i++)
{
if ('A' <= s[i] && s[i] <= 'Z') cout << "_" << (char)(s[i] - 'A' + 'a'); //大写转小写。
else cout << s[i];
}
cout << endl;
}
else if (t == 3) cout << s << endl; //什么情况都没有。
}
int main()
{
while (cin >> s) //处理多组数据。
{
len = s.length();
int t = find_op();
calc(t);
}
return 0;
}
首发:2022-01-29 09:57:57
标签:SP1163,int,题解,len,报错,情况,false From: https://www.cnblogs.com/liangbowen/p/16622756.html