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)];char*はいくつかの奇妙なコードであり、 null で終了しない可能性があるため、UB を呼び出します。これは と同等であり、 から返されるstring letter = &word[0];参照のアドレスを取得しています。また、二重引用符の使用は間違っていますが、文字列リテラルです。と比較する単一引用符が必要です。charoperator[]"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;
    }
...

文字変数は、反復ごとに更新する必要があります。そうでない場合は、空のままです。また、他の回答で述べたように、文字を 1 つずつ反復処理しているcharため、letter.

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

iはグローバル変数で、0に初期化されます。しかし、問題は文字列にありますword。空文字列です。キャラクター&word[0]の位置を表示します。\0そのletterため、空の文字列として初期化されます。そのため、実際には最後のelseステートメントに到達しており、letter空であるため何も出力されません。

于 2013-05-30T03:41:47.933 に答える
0

を定義しますstring letter = &word[int (i)];。これはあなたが考えているようにはなりません。iステートメントの実行時にの値を使用します。後で変更iしても の値は変更されませんletterword[i]ループ内で明示的に評価する必要があります。また、 vs "a""e"などを比較すると、本当に文字比較が必要な場合に文字列が比較されます。二重引用符の代わりに一重引用符を試してください'a'(例: 'e', など)。

于 2013-05-30T03:46:43.700 に答える