Вот один из возможных способов сделать это.Не обязательно самый эффективный и без полной проверки ошибок.
Редактировать Обновлено на основе комментария к другому сообщению, которое звучит так, как будто скобки могут быть где угодно в строке.Это удаляет совпадающие все совпадающие скобки, если для всех них есть совпадающая закрывающая скобка. не удаляет их все, если закрывающая скобка не найдена.ОП должен сделать немного домашней работы.Он также не проверяет правильную балансировку скобок, что для меня не ясно, является ли это требованием.
// 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 );
}