2015-02-11 46 views
-1

我有一個由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; 
} 
+3

你熟悉的std :: string? – DaveyLaser 2015-02-11 18:22:44

+0

由兩個主音你的意思是元音對不對? – 2015-02-11 18:24:47

+0

@lazer_wizard不是真的 – 2015-02-11 18:26:09

回答

3

您使用strcpy錯在這裏。

該方法在重疊緩衝區上使用時不安全。在閱讀之前,你正在寫內存,造成奇怪的行爲。

您需要使用memmove,編寫自己的循環來複制字符,或者使用兩個不同的字符緩衝區來輸入和結果,而不僅僅是p。

0

您的問題與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; 
} 
0

我會建議您採取C++的std對象的優勢,你的代碼看起來更下的std :: string提供了更容易比C數組使用,同樣的訪問和修改方法爲std ::向量。

一個簡單的例子:

#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; 
}