字符串中的重复元音
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;
}