我正在研究一个小程序,我被卡住了。我有一个
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}]Twain
和sv_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语句之后没有继续使用代码吗?
答案 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;
}
我知道它不会使用各种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