我试图摆脱字符串周围的括号。例如:我可以拥有(此字符串)或{This String}或[This String]或+ This String +。我想只返回 This String (没有任何类型的括号或+ s)。
我花了很多时间在正则表达式上并放弃了。如果你能提供帮助,那就太棒了。
答案 0 :(得分:1)
这是一种可行的方法。不一定是效率最高且没有完整的错误检查。
编辑根据对其他帖子的评论进行更新,使其听起来好像括号可以在字符串中的任何位置。只要所有匹配的括号括号都匹配,就会删除匹配的所有匹配括号。如果找不到右括号,它会不全部删除它们。 OP需要做一些功课。它也没有检查支架的正确平衡,如果这是一个要求我不清楚。
// return 1 if a bracket is found
int RemoveBracket( char *str )
{
char openbracket[] = {'[', '(', '{', '+', '\0' };
char closebracket[] = {']', ')', '}', '+', '\0' };
int start, end, j;
char match = 0;
// find open bracket
start = 0;
for ( ; str[start] && !match; start++ ) {
for ( j = 0; openbracket[j] && !match; j++ ) {
if ( str[start] == openbracket[j] )
match = closebracket[j];
}
if ( match )
break;
}
if ( match == 0 )
// no open bracket found
return 0;
// find closing bracket
end = start + 1;
for ( ; str[end]; end++ ) {
if ( str[end] == match )
break;
}
if ( !str[end] )
// no closing bracket found
return 0;
// remove them
memmove( str + start, str + start + 1, end - start - 1 );
memmove( str + end - 1, str + end + 1, strlen( str + end ) );
return 1; // since we found one
}
void RemoveBrackets( char *str )
{
// remove matching brackets.
while ( RemoveBracket(str ))
;
}
int main( int argc, char* argv[] )
{
char str[50];
strcpy( str, "a[b(c)de]" );
RemoveBrackets( str );
printf( "%s\n", str );
strcpy( str, "{not bracketed" );
RemoveBrackets( str );
printf( "%s\n", str );
strcpy( str, "(paren)s" );
RemoveBrackets( str );
printf( "%s\n", str );
strcpy( str, "abc+def+{gh}i" );
RemoveBrackets( str );
printf( "%s\n", str );
}
答案 1 :(得分:1)
我找到了一种更简单的方法来解决这个问题:
转到字符串中的每个字符(如果它与{[(<+_->)]}
匹配),然后用空格替换该字符,然后稍后修剪该空格。
非常感谢你的帮助。
答案 2 :(得分:0)
这是我的解决方案:
int main(int argc, char *argv)
{
char *string = "abc [def] ghi";
char *final = (char *) malloc(strlen(string) + 1);
int length = 0;
int count = 0;
// process every single character of string
for(count; count <= strlen(string); count++) {
// check if it has to be copied or not
if(string[count] != '[' && string[count] != ']') {
// if it has, copy it and increase length of final
final[length] = string[count];
length += 1;
}
}
// then 'throw away' unused memory
final = (char *) realloc((void *) final, length);
printf("%s\n", final);
}
这是输出:
blackbear@blackbear-laptop:~$ ./prova.out
abc def ghi
然后通过if..else if..else if..
或switch(string[count])
或再次使用数组添加您的I / O代码及其括号类型,并将我的if
替换为每个检查的循环支架类型。
答案 3 :(得分:0)
使用c字符串非常简单。
char s[] = "{test}";
size_t t = strlen(s) - 2;
memmove(s, s + 1, t);
s[t] = '\0';
答案 4 :(得分:-1)
char currentChar,initChar;
initChar=myString[0];
//You should check if exits
currentChar=myString[1];
string noBracketString;
int cont=0;
while(currentChar!=initChar){
noBracketString+=currentChar;
cont++;
currentChar=myString[cont];
}
//String without brackets
return noBracketString;
希望帮助!