使用C ++语言,函数LetterChanges(str)
将传递str
参数并使用以下算法对其进行修改。
将字符串中的每个字母替换为后面的字母 字母表(即c变为d,z变为a)。然后大写每个元音 在这个新的字符串(a,e,i,o,u)中,最后返回此修改后的字符串 字符串。
#include <iostream>
using namespace std;
string LetterChanges(string str) {
// code goes here
string str2 = "abcdefghijklmnopqrstuvwxyz";
int j;
for (int i = 0; str[i] != '\0'; i++) {
for (j = 0; str2[j] != '\0'; j++) {
if (str[i] == str2[j]) {
str[i] = str2[j + 1];
}
}
}
for (int i = 0; str[i] != '\0'; i++) {
if (str[i] == 'a') {
str[i] = 'A';
}
else if (str[i] == 'e') {
str[i] = 'E';
}
else if (str[i] == 'i') {
str[i] = 'I';
}
else if (str[i] == 'o') {
str[i] = 'O';
}
else if (str[i] == 'u') {
str[i] = 'U';
}
}
return str;
}
int main() {
// keep this function call here
cout << LetterChanges(gets(stdin));
return 0;
}
我正在尝试运行此代码,但它没有给出欲望输出请帮助..
答案 0 :(得分:2)
功能
让我们从你的第一个循环开始:
for (int i = 0; str[i] != '\0'; i++) {
for (j = 0; str2[j] != '\0'; j++) {
if (str[i] == str2[j]) {
str[i] = str2[j + 1];
}
}
}
这里有几件事。首先,我们甚至不需要处理str2
。 C ++中的字符使用ASCII编码,这意味着我们实际上可以执行str[i]++
之类的操作来将'a'更改为'b'或将'e'更改为'f'等等... < / p>
另外,我建议不要使用str[i] != '\0'
。我们使用标准库字符串而不是c字符串是有原因的,所以我们也可以让我们的生活更轻松并使用str.size()
。沿着这些方向,我建议str.at(i)
而不是str[i]
,因为前者会检查我们。
最后,如果你包含cctype
,那么我们可以使用isalpha
函数来确保我们只修改字母字符(没有数字或空格等)。
因此,您的第一个循环可以变为:
for (int i = 0; i < str.size(); i++) {
if(isalpha(str.at(i)){
if(str.at(i) == 'z') str.at(i) = 'a'; //special case
else str.at(i)++;
}
}
就你的第二个循环而言,你根本不需要它!我们实际上可以直接将所有内容整合到第一个中。只要我们确保在之后进行元音修改,我们就会更改单个字母。
从小写到大写的转换也可以通过一些ASCII数学来完成。小写和大写字母之间的区别是'A'-'a'
,所以如果我们将它添加到任何小写字母,它将为我们提供大写字母!
通过所有这些,我们可以将您的代码修改为:
for (int i = 0; i < str.size(); i++) {
if(isalpha(str.at(i)){ //Make sure it's a letter!
if(str.at(i) == 'z') str.at(i) = 'a'; //special case
else str.at(i)++;
if(str.at(i) == 'a' | str.at(i) == 'e' | str.at(i) == 'i'
| str.at(i) == 'o' | str.at(i) == 'u') {
str.at(i) += 'A' - 'a';
}
}
您的主要
这里只有一件事要解决。不要使用gets
作为输入。如果您要查找单个单词,请使用提取运算符>>
,或者如果您需要整行,请使用getline。
string word, line;
getline(cin, line);
cin >> word;
cout << LetterChanges(line) << endl;
cout << LetterChanges(word) << endl;