有人可以帮我写几行 C++ 代码来转换输入字符串字母,如下所示:
- 小写字母转大写字母。
- 大写字母转小写字母。
- 不允许使用库函数。
- if 语句,比较,| 操作和 & 不允许。
谢谢。
您可以编写一个翻译数组(= map)。
a -> A
A -> a
b -> B
B -> b
...
z -> Z
Z .. z
对于 ASCII,您可以将其实现为char[]
128 个条目,只需使用源字符作为索引来读取结果字符。
char translate[128];
translate['A']='a';
...
可能的实现:
// The following init-String is quite long (128 characters)!
char* translate=" abcdefghijklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ ";
int i=0;
while(0!=s[i])
s[i] = translate[s[i++]];
如果您的输入是 ASCII,您可以简单地将第 5 位反转,这意味着将值 32 异或到每个字符。这会将小写转换为大写,反之亦然。
唯一的问题是它只适用于 a-zA-Z 而没有别的。
您可以使用std::transform
和 功能的组合toupper
和tolower
。
编辑:抱歉错过了你的最后两点。您将不得不执行类似 for 的循环,并且可以使用三元运算符?
来避免 if 语句。大写的可能解决方案是:
for (unsigned i = 0; i < s.size(); ++i) {
s[i] = (s[i] >= 'a' && s[i] <= 'z') ? s[i] - 'a' + 'A' : s[i];
}
像这样的东西会起作用,但前提是你有字母
char c = 'a';
int e = c;
int d = e < 90 ? e + 32 : e - 32;
我的解决方案:正在寻找其他人。
string s;
cin>>s;
int a[3] = {'A', 'a', 'a'};
int A[3] = {'a', 'A', 'A'};
for (int i=0; i<s.size(); ++i)
s[i] = s[i] - a[(s[i]-'A')/26] + A[(s[i]-'A')/26];
cout << s << endl;
感谢您的尝试。