译者输出问题

时间:2013-05-30 03:34:44

标签: c++

我正在制作一个乱码翻译器,你输入一个单词,控制台输出乱码。乱码语言的参数是,如果单词中有任何元音,你将“ab”放在元音的前面。例如,胡言乱语中的“你好”将是“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 个答案:

答案 0 :(得分: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;
    }

答案 1 :(得分:1)

请改为尝试:

string letter;
...

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

    letter = word[i];

    if (letter == "a") {

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

必须在每次迭代时更新字母变量,否则它将保持为空。 另外,正如其他答案中所提到的,当你逐个遍历字符时,它将是一个更好的选择,以便char使用letter类型。

答案 2 :(得分:0)

string letter = &word[int (i)];

i是全局变量,初始化为 0 。但问题是字符串word。这是一个空字符串。 &word[0]会为您提供\0个字符的位置。因此,letter被初始化为空字符串。所以,你实际上是在点击最后的else语句而没有打印任何内容,因为letter也是空的。

答案 3 :(得分:0)

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