0

我正在制作一个乱码翻译器,您在其中输入一个单词,控制台以乱码输出单词。乱码语言的参数是如果单词中有任何元音,则在该元音前面加上“ab”。例如,乱码中的“Hello”将是“H-ab-ell-ab-o”。尽管我遇到了问题(如果您发现此代码混乱或写得不好,请放轻松。我只是在学习)

这是我的代码:

int quit = 2;
int i;
bool vowel;
string word;
string letter = &word[int (i)];

void translation() {

cout << "Enter a word: " << endl;
cin >> word;
for (int i = 0; i <= 20; ++i) {

    if (letter == "a") {

        cout << "ab" << letter;
    }
    if (letter == "e") {

        cout << "ab" << letter;
    }
    if (letter == "i") {

        cout << "ab" << letter;
    }
    if (letter == "o") {

        cout << "ab" << letter;
    }
    if (letter == "u") {

        cout << "ab" << letter;
    } else {

        cout << letter ;
    }

}
}

void again() {

cout << "Enter 1 to translate another word, Enter 0 to quit" << endl;
cin >> quit;
}

int main() {

while (quit >= 1) {
    translation();
    again();
}
    return 0;
}

比如说,当它提示你输入这样的词时:

Enter a word:

您输入单词 Hello,它应该输出以下内容:

Enter a word:
Hello 
Habellabo 
Enter 1 to translate another word, Enter 0 to quit

但我的程序输出这个:

Enter a word: 
hello
Enter 1 to translate another word, Enter 0 to quit

为什么不输出翻译后的单词?

4

4 回答 4

1

string letter = &word[int (i)];是一些奇怪的代码,并调用 UB 因为它char*可能不是空终止的。它等效于,string letter = &word[0];并且您正在获取从 .char返回的引用的地址operator[]。此外,使用双引号是错误"a"的字符串文字。您希望单引号与char.

将您的代码更改为以下内容:

for (int i = 0; i < word.size(); ++i) {

    if (word[i] == 'a') {

        cout << "ab" << word[i];
    }
    if (word[i] == 'e') {

        cout << "ab" << word[i];
    }
    if (word[i] == 'i') {

        cout << "ab" << word[i];
    }
    if (word[i] == 'o') {

        cout << "ab" << word[i];
    }
    if (word[i] == 'u') {

        cout << "ab" << word[i];
    } else {

        cout << word;
    }
于 2013-05-30T03:48:27.857 回答
1

试试这个:

string letter;
...

for (int i = 0; i <= word.length(); ++i) {

    letter = word[i];

    if (letter == "a") {

        cout << "ab" << letter;
    }
...

字母变量必须在每次迭代时更新,否则它保持为空。此外,正如其他答案中所提到的,当您逐个遍历字符时,将char类型用于letter.

于 2013-05-30T03:49:20.740 回答
0
string letter = &word[int (i)];

i是全局变量并初始化为0。但问题在于字符串word。它是一个空字符串。&word[0]为您提供\0角色的位置。所以,letter被初始化为一个空字符串。因此,您实际上是在执行最后的 else 语句,并且没有打印任何内容,因为 theletter也是空的。

于 2013-05-30T03:41:47.933 回答
0

你定义string letter = &word[int (i)];. 这并不像你想象的那样。它使用i语句执行时的值。稍后更改i不会更改 的值letter。您需要word[i]在循环内显式评估。此外,比较 vs "a","e"等比较字符串,当你真的想要字符比较时。尝试使用单引号而不是双引号,即'a','e'等。

于 2013-05-30T03:46:43.700 回答