我有一个包含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;
}
答案 0 :(得分:3)
您在此处使用strcpy
错误。
该方法在重叠缓冲区上使用是不安全的。在你阅读它之前,你正在写入内存,导致奇怪的行为。
您需要使用memmove
,编写自己的循环来复制字符,或者使用两个不同的字符缓冲区来输入和结果,而不仅仅是p。
答案 1 :(得分:0)
您的问题出在strcpy
。它将值onr复制为1,因此在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;
}
答案 2 :(得分: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;
}