字符串中的重复元音

Duplicate vowels in a string

本文关键字:字符串      更新时间:2023-10-16

我有一个由100个元素组成的字符串,每当我找到一个元音时,我都必须复制每个元音,并将其添加到字符串的下一个位置。问题是,如果字符串中的两个连续位置上有两个元音,那就不起作用了。

这就是我尝试过的:

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    char p[200];
    int i=0,n;
    cin.get(p,200);
    while(i<strlen(p)){
        if(strchr("aeiou",p[i])) {
            strcpy(p+i+2,p+i+1);
            p[i+1]=p[i];
            i=i+2;
        }
        else i++;
    }
    cout<<p;
    return 0;
}

此处使用strcpy错误。

该方法在重叠缓冲区上使用不安全。你在读之前就在给记忆写信,这会导致奇怪的行为。

您需要使用memmove,编写自己的循环来复制字符,或者使用两个不同的字符缓冲区来输入和结果,而不仅仅是p。

您的问题是strcpy。它一个接一个地复制onr的值,所以在p[i]复制到p[i+1]之后,p[i+1]的新值复制到p[i+2],依此类推。所以字符串将只包含p[i]

您可能希望使用另一个数组作为目标字符串,并每次复制一个字符。这也将避免许多strcpy调用,从而节省时间。

代码:

#include <iostream>
#include <cstring>
using namespace std;
int main()
{
    char p[100] = {0};
    char dest[200] = {0};
    cin.get(p, 100);
    int i = 0, j = 0;
    while(p[i]){
        if (strchr("aeiou",p[i])) {
            dest[j++] = p[i];
        }
        dest[j++] = p[i++];
    }
    cout << dest;
    return 0;
}

我建议您利用C++std对象,您的代码看起来更像C.std::string提供了比C数组更容易使用的访问和修改方法,std::vectors也是如此。

举个简单的例子:

#include <iostream>
#include <string>
#include <vector>
std::string editStr = "qweertadoi";
std::vector<char> vowels{'i', 'o', 'u', 'e', 'a'};
int main() {
    for(unsigned int i = 0; i<editStr.size(); i++){
        for(char c: vowels){
            if(editStr.at(i) == c){
                editStr.insert(i++,1, c);
                break;
            }
        }
    }
    std::cout << editStr << std::endl; 
    return 0;
}