字符串代码不起作用

时间:2017-08-07 15:44:49

标签: c++ string

使用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;
}

我正在尝试运行此代码,但它没有给出欲望输出请帮助..

1 个答案:

答案 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;