删除两个字符之间的文本

时间:2016-06-05 17:55:59

标签: c++

我正在研究一个小程序,我被卡住了。我有一个

const char *dvar_hostname;

我在这个char数组上写了一个字,f.e。

"[12]1234" or "1234"

所以现在我必须检查我在char*上写的字是否包含[],如果是,请删除括号及其中的文字,所以

"[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();
            }

但这并没有像我想要的那样结果,所以非常感谢任何帮助。

编辑:

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[w/ Clantag]: [{TM}]Twainsv_hostname[w/o Clantag]: Twain, btw dvar_hostname1&amp; 2 are booth const char *` 我在其他地方这样做:

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

// Player(Client).getGT()返回&#34; Twain&#34;在这种情况下... 知道为什么它在if语句之后没有继续使用代码吗?

5 个答案:

答案 0 :(得分:6)

您想使用erase

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

请记住,您需要检查第一个或最后一个是否等于std::npos

答案 1 :(得分:1)

为什么不是这个非常简单的解决方案,使用久经考验的for循环和布尔值?

#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函数,但有时为了解决问题,你只需退后一步,采取通常看似最明显的解决方法问题。

答案 2 :(得分:1)

各种答案和评论包含大量关于实际要求的隐含推测。从您的示例中,一些字符串将以&#39; [&#39;接下来是几个字符,然后是&#39;]&#39;,您想要删除所有内容,包括&#39;]&#39;。这很简单:

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

如果您有其他未说明的要求(例如必须保留的&#39; [&#39;或方括号中包含多组字符),您应该说出这些要求是什么,以便您和#39;得到有意义的答案,而不是猜测和矫枉过正。

编辑,按@TomerW:

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

答案 3 :(得分: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

答案 4 :(得分: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