2016-03-22 15 views
1

İlk önce 'w' ve son 'w' bir dizeden silinmeye çalışıyorum.Karakter dizisinden ilk ve son 'X' karakterini sil

char str1[80], *pstr1, *pstr2; 
cout << "Enter a String:\n"; 
gets_s(str1); 
pstr1 = str1; 
pstr2 = new char[strlen(str1)]; 
int n = strlen(str1) + 1, k = 0, i = 0; 
bool s = true; 
while (k < n+1) 
{ 

    if (strncmp((pstr1 + k), "w", 1) != 0) 
    { 
     *(pstr2 + i) = *(pstr1 + k); 
     i++; 
     k++; 
    } 
    else if(s == true) 
    {  
     k++; 
     s = false; 
    } 
    else 
    { 
     *(pstr2 + i) = *(pstr1 + k); 
     i++; 
     k++; 
    } 
} 
+0

Yanlışlıkla ilgili sayıda argümanı olan 'gets_s' öğesini çağırırsınız. Derleyiciniz bundan bahsetmeli. Derleyicinizin size anlattığı her şeyi anlamak ve düzeltmek önemlidir. –

+0

Başka bir sorun, dize aslında herhangi bir "w" içermediyse, pstr2'nin arabellek taşmasına neden olabilirsiniz ([MCVE] (http://stackoverflow.com/help/mcve) göndermediğinden emin olamaz (http://stackoverflow.com/help/mcve) –

cevap

3

Hayatınızı Kolaylaştırın ve find_first_of, find_last_of ve erase ile std::string kullanın: Burada ilk 'w' silinmez ancak sonuncusu silemedi ve benim kodudur.

#include <string> 

void erase_first_of(std::string& s, char c) 
{ 
    auto pos = s.find_first_of(c); 

    if (pos != std::string::npos) 
    { 
     s.erase(pos, 1); 
    } 
} 

void erase_last_of(std::string& s, char c) 
{ 
    auto pos = s.find_last_of(c); 

    if (pos != std::string::npos) 
    { 
     s.erase(pos, 1); 
    } 
} 

#include <iostream> 

int main() 
{ 
    std::string s = "hellow, worldw\n"; 

    erase_first_of(s, 'w'); 
    erase_last_of(s, 'w'); 

    std::cout << s; 
}