转换器输出问题

Translator Output Problems

本文关键字:出问题 输出 转换器      更新时间:2023-10-16

我正在制作一个胡言乱语翻译器,您可以在其中输入一个单词,控制台以胡言乱语输出该单词。胡言乱语的参数是,如果单词中有元音,你就在元音前面加上"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

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

string letter = &word[int (i)];是一些奇怪的代码,它调用UB是因为char*可能不是以null结尾的。它相当于string letter = &word[0];,并且您正在获取从operator[]返回的对char的引用的地址。此外,使用双引号是错误的"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;
    }

试试这个:

string letter;
...
for (int i = 0; i <= word.length(); ++i) {
    letter = word[i];
    if (letter == "a") {
        cout << "ab" << letter;
    }
...

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

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

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

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