c++ 如何将一个字符串复制到另一个字符串?

pftdvrlh  于 2022-12-01  发布在  其他
关注(0)|答案(1)|浏览(362)

我正在编写一个函数,它从一个字符串(用户名)中删除元音,然后将该函数传递给另一个函数,该函数将打印出不带元音的用户名。为了将input[i]复制到outputNoVowels,这是正确的做法吗?

string removeVowels(string input) {
    string outputNoVowels;
    
    for (int i = 0; i < input.length() - 1; i++) {
        switch (input[i]) {
        case 'a':
            break;
        case 'e':
            break;
        case 'i':
            break;
        case 'o':
            break;
        case 'u':
            break;
        case 'A':
            break;
        case 'E':
            break;
        case 'I':
            break;
        case 'O':
            break;
        case 'U':
            break;
        default:
            outputNoVowels = input[i];

        }
    }
    return outputNoVowels;
}

为什么当程序运行时,它只打印出字符串中的一个字母?
提供的算法:

以下是控制台窗口中打印的内容:

UPDATE:如何对char[]字符串执行同样的操作?

void removeVowels(const char input[], char output[]) {
    for (int i = 0; i < strlen(input) - 1; i++) {
        switch (input[i]) {
        case 'a':
            break;
        case 'e':
            break;
        case 'i':
            break;
        case 'o':
            break;
        case 'u':
            break;
        case 'A':
            break;
        case 'E':
            break;
        case 'I':
            break;
        case 'O':
            break;
        case 'U':
            break;
        default:
            strcpy(output, input);
            strcat(output, input);
        }
    }
}

提供的算法:

k5ifujac

k5ifujac1#

在输出中得到1个字母是因为您通过=赋值运算符每个字母赋值给outputNoVowels,每次都清除其当前内容,因此return上的outputNoVowels中最多只有1个字母。
您需要通过+=操作符(或push_back()append()方法)将每个字母**追加 *,到outputNoVowels,从而保留任何现有内容。
另外,你的循环忽略了input字符串中的最后一个字符。指令中有一个打字错误。
请尝试以下操作:

string removeVowels(const string &input) {
    string outputNoVowels;
    const size_t len = input.length();
    for (size_t i = 0; i < len; ++i) {
        switch (input[i]) {
            case 'a':
            case 'e':
            case 'i':
            case 'o':
            case 'u':
            case 'A':
            case 'E':
            case 'I':
            case 'O':
            case 'U':
                break;
            default:
                outputNoVowels += input[i];
                // or: outputNoVowels.push_back(input[i]);
                // or: outputNoVowels.append(1, input[i]);
                break;
        }
    }
    return outputNoVowels;
}

也就是说,您可以使用标准的std::copy_if()算法(以std::back_inserter作为目标)来完全消除switch,例如:

string removeVowels(const string &input) {    
    static const string vowels = "aeiouAEIOU";
    string outputNoVowels;
    copy_if(input.begin(), input.end(),
        back_inserter(outputNoVowels),
        [&](char ch){ return vowels.find(ch) == string::npos; }
    );
    return outputNoVowels;
}

或者,使用std::remove_if()算法,例如:

string removeVowels(string input) {    
    static const string vowels = "aeiouAEIOU";
    input.erase(
        remove_if(input.begin(), input.end(),
            [&](char ch){ return vowels.find(ch) != string::npos; }
        ),
        input.end()
    );
    return input;
}

或者,使用std::erase_if()算法(C++20及更高版本),例如:

string removeVowels(string input) {    
    static const string vowels = "aeiouAEIOU";
    erase_if(input,
        [&](char ch){ return vowels.find(ch) != string::npos; }
    );
    return input;
}

UPDATE:在您的char[]版本中,您遇到了相反的问题。您在输出字符串中 * 追加了*太多的字母。对于您要保留的每个字母,您将整个输入字符串分配给输出,然后将整个输入字符串追加到末尾,而不仅仅是1个字母。

您可以使用与上面类似的技巧来求解char[]版本,例如:

void removeVowels(const char input[], char output[]) {
    int idx = 0;
    const int len = strlen(input);
    for (int i = 0; i < len; ++i) {
        switch (input[i]) {
            case 'a':
            case 'e':
            case 'i':
            case 'o':
            case 'u':
            case 'A':
            case 'E':
            case 'I':
            case 'O':
            case 'U':
                break;
            default:
                output[idx++] = input[i];
                break;
        }
    }
    output[idx] = '\0';
}

或者,使用std::copy_if()算法:

void removeVowels(const char input[], char output[]) {    
    static const char[] vowels = "aeiouAEIOU";
    static const char*  vowels_end = vowels + strlen(vowels);
    char* output_end = copy_if(input, input + strlen(input),
        output,
        [&](char ch){ return find(vowels, vowels_end, ch) == vowels_end; }
    );
    *output_end = '\0';
}

相关问题