2016-06-05 6 views
0

так что я работаю над небольшим программным обеспечением теперь и им застрял. У меня естьУдалить текст между двумя символами

const char *dvar_hostname; 

и я пишу слово на этом массиве символов, f.e.

"[12]1234" or "1234" 

так что теперь я должен проверить, если слово я написал на этом полукокса * содержит [и], а если так удалить скобки и текст в ней, так

"[12]1234" 

становится

"1234" 

он должен быть записан на const char * в конце снова (так что я думаю, вам нужно будет использовать временную строку). Я пытался что-то вроде этого:

dvar_hostname = "[12]1234"; 
      string host = string(dvar_hostname); 
      if(host.substr(1) == "[") 
      { 
       string str = string(dvar_hostname); 
       unsigned first = str.find("]"); 
       unsigned last = str.find("["); 
       string newString = str.substr (first,last-first); 
       const char *tempHostName = newString.c_str(); 
      } 

, но это не получилось так, как я хотел тоже, так что любая помощь очень ценится :)

EDIT:

if(strcmp(dvar_hostname2, Dvar_GetString("sv_hostname"))) 
     { 
      dvar_hostname2 = Dvar_GetString("sv_hostname"); 
      dvar_hostname1 = Dvar_GetString("sv_hostname"); 
      printf("sv_hostname[w/ Clantag]: %s\n", dvar_hostname1); 
      bool open_bracket = true; 
      bool end = false; 

      size_t pos_open = 0; 
      size_t pos_close = 0; 

      string dh(dvar_hostname1);//get string value 
      while(!end){ 
       pos_open = dh.find('['); 
       pos_close = dh.find(']'); 


       if(pos_open == string::npos || pos_close == string::npos || pos_close < pos_open){ 
        end = true; 
       }else{ 
        dh.erase(pos_open, pos_close - pos_open + 1); 
       } 
      } 
      dvar_hostname1 = dh.c_str(); 
      printf("sv_hostname[w/o Clantag]: %s\n", dvar_hostname1); 
     } 

это печатает: "sv_hostname [ж/Clantag]: [{TM}] Твена" и "sv_hostname [ш/о Clantag]:" Твен, кстати dvar_hostname1 & 2 представляют собой стенд Const символ * затем в других местах им делать это:

if(!strcmp(Player(Client).getGT(), dvar_hostname1) 

// Player (Client) .getGT() возвращает «Twain» в этом случае ... любая идея, почему он не продолжает код после этого оператора if?

+1

Если вы используете C++ 11, 'зЬй :: regex_replace (хост, станд :: регулярное выражение, "") ' – Praveen

+0

@Praveen no i'm not sry :( – SyxDuLappen

+0

* t необходимо записать на const char * в конце снова * - Зачем вам« нужна »эта« необходимость »? Вы меняете string, поэтому в чем причина этого требования? – PaulMcKenzie

ответ

1

Различные ответы и комментарии содержат много неявных предположений о реальных требованиях. В вашем примере некоторые строки начинаются с символа '[', за которым следует несколько символов, а затем ']', и вы хотите удалить все до и включая ']'. Это просто:

const char* str = "[12]1234"; 
char target[20]; // or whatever size is appropriate 
const char* loc = strchr(str, ']'); 
strcpy(target, loc ? loc + 1 : str); 

Если у вас есть дополнительные неявные требования (например, символы перед «[», которые должны быть сохранены или несколько наборов символов, заключенных в квадратные скобки), вы должны сказать, что эти требования таким образом, чтобы вы получите исчерпывающие ответы вместо угадываний и излишних ответов.

EDIT, в @TomerW: { "[. * \\] \\"}

const char* str = "[12]1234"; 
const char* loc = strchr(str, ']'; 
return loc ? loc + 1 : str; 
+0

это совершенно просто и чисто, а также исправлено и другая проблема :) – SyxDuLappen

+0

, если вы пренебрегли возможностью, чтобы «[» предшествуют символы, вы можете быть быстрее с помощью return (loc? Loc + 1: str); // пропуская копию –

+0

@TomerW - еще лучше! –

0

Это должно работать для вас:

#include <iostream> 
#include <string> 

int main(void) { 
    const char * dvar_hostname = "[12]1234"; 
    std::string host = std::string(dvar_hostname); 
    std::size_t pos = host.find("]"); 
    const char *tempHostName = host.substr(pos+1).c_str(); 
    std::cout << tempHostName; 
} 

доказательство он работает: http://ideone.com/a4bI83

+0

За исключением того, что он будет удален, даже если первый символ - это что-то еще, и он не удаляет его несколько раз, и если в нем нет правого скобки, он сработает? – coyotte508

+0

ну, конечно, вам нужно проверить, не найден ли этот поиск npos. – paweldac

+0

Как насчет строки "124 [12] 123"? Он удалит начало «124», когда это не предполагается. – coyotte508

6

Вы хотите использовать erase

size_t first = str.find("["); 
size_t last = str.find("]", first); 
str.erase(first,last-first+1); 

Помните, что вы должны будете проверить, что ни первый или последний равны std::npos

+0

dvar_hostname = "[12] 1234"; \t \t \t \t string str = string (dvar_hostname); \t \t \t \t size_t first = str.find ("]"); \t \t \t \t size_t last = str.find ("[", first); \t \t \t \t str.erase (сначала, последний раз); \t \t \t \t const char * tempHostName = str.c_str(); \t \t \t \t Е ("tempHostName:% s \ п", tempHostName); // это распечатывается "[12" – SyxDuLappen

+0

@SyxDuLappen использовать что-то вроде http://ideone.com, запустите код, и связать его с нас. – coyotte508

+0

@SyxDuLappen извинения, я на самом деле не запускал код, только что отредактированный, чтобы исправить порядок и выйти из одной ошибки. – David

0

Это делает это:

bool end = false; 

size_t pos_open = 0; 
size_t pos_close = 0; 

const char *dvar_hostname = "123[456]79[88]"; 
string dh(dvar_hostname);//get string value 
while(!end){ 
    pos_open = dh.find('['); 
    pos_close = dh.find(']'); 

    if(pos_open == string::npos || pos_close == string::npos || pos_close < pos_open){ 
     end = true; 
    }else{ 
     dh.erase(pos_open, pos_close - pos_open + 1); 
    } 
} 

dvar_hostname = dh.c_str();//convert back 
cout << dvar_hostname; 

Рабочий пример: Ideone


Я усовершенствовал ее зажженную немного:

bool open_bracket = true; 
bool terminate = false; 

size_t pos_open = 0; 
size_t pos_close = 0; 
size_t last = 0; 

const char *dvar_hostname = "123]][][[[[456]79[88][["; 
string dh(dvar_hostname);//get string value 
while(!terminate){ 
    string temp = dh.substr(last); 
    pos_open = temp.find('['); 
    pos_close = temp.find(']'); 

    terminate = (pos_open == string::npos || pos_close == string::npos); 

    if(!terminate && pos_close > pos_open){ 
      dh.erase(pos_open + last, pos_close - pos_open + 1); 
    }else if(pos_open != string::npos || pos_close < pos_open){ 
     last += pos_open; 
    }else if(pos_close != string::npos){ 
     last += pos_close; 
    } 
} 

dvar_hostname = dh.c_str();//convert back 
cout << dvar_hostname; 

Это выведет "123]]79[[" Ideone

+0

Нет, это не так :) «123] [12] 123», t стереть «[12]» – coyotte508

+0

Вы правы, позвольте мне исправить это –

+0

ily <3 thx so much :) EDIT: это нормально, так как текст всегда начинается с скобок ... – SyxDuLappen

1

Почему это не очень простое решение, используя t ried и true for loop и boolean?

#include <iostream> 
#include <string> 

void ChangeString(std::string& test) 
{ 
    bool inbracket = false; 
    std::string outStr; 
    for (size_t i = 0; i < test.size(); ++i) 
    { 
     char ch = test[i]; 
     if (ch == '[') 
      inbracket = true; 
     else 
     if (ch == ']') 
      inbracket = false; 
     else 
     if (!inbracket) 
      outStr += ch; 
    } 
    test = outStr; 
} 

using namespace std; 

int main() 
{ 
    std::string test = "[12]1234[56]78"; 
    ChangeString(test); 
    cout << test; 
} 

Live Example

Я знаю, что он не использует все виды std::string функций, но иногда, чтобы решить проблему, вы просто должны сделать шаг назад и прибегнуть к тому, что, как правило, кажется, наиболее очевидный способ решения проблемы.

Смежные вопросы