сопоставьте, какая скобка содержит строку, и удалите ее - PullRequest
0 голосов
/ 12 января 2011

Я пытаюсь избавиться от скобок вокруг строки. Например: я могу иметь (Эта строка) или {Эта строка} или [Эта строка] или + Эта строка +. Я хочу вернуть только эту строку (без каких-либо скобок или + s).

Я провел так много времени вокруг регулярных выражений и сдался. Если бы вы могли помочь, было бы здорово.

Ответы [ 5 ]

1 голос
/ 14 января 2011

Я нашел более простой способ справиться с этим:

Перейдите через каждый символ в строке, если он соответствует {[(<+_->)]}, затем замените этот символ пробелом, а затем обрежьте его позже.

Большое спасибо за вашу помощь.

1 голос
/ 12 января 2011

Вот один из возможных способов сделать это.Не обязательно самый эффективный и без полной проверки ошибок.

Редактировать Обновлено на основе комментария к другому сообщению, которое звучит так, как будто скобки могут быть где угодно в строке.Это удаляет совпадающие все совпадающие скобки, если для всех них есть совпадающая закрывающая скобка. не удаляет их все, если закрывающая скобка не найдена.ОП должен сделать немного домашней работы.Он также не проверяет правильную балансировку скобок, что для меня не ясно, является ли это требованием.

// 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 );
}
0 голосов
/ 12 января 2011

Это довольно просто для строки c.

char s[] = "{test}";

size_t t = strlen(s) - 2;
memmove(s, s + 1, t);
s[t] = '\0';
0 голосов
/ 12 января 2011

Вот мое решение:

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]) или снова, используя массив, и замените мой if на цикл, который проверяет каждый тип скобок.

0 голосов
/ 12 января 2011
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;

Надежда помогает!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...