Я не уверен, что конкретно не так с этим кодом, но для эффективности я бы сохранил стек из последних найденных (
символов и использовал бы его для удаления порций всякий раз, когда вы обнаружите )
.
В полупсевдокоде:
// str is the input string, set up to and from pointers.
stacktype stack = empty-stack
char *from = str
char *to = str
// Process every character once and once only.
while *from != '\0':
switch *from:
// Open, transfer character and store position on stack.
case '(':
*to++ = *from++
stack.push (to - 1)
break
// Close, get most recent '(' and adjust to for overwrite.
// If no most recent, just transfer as is.
case ')':
if stack is not empty:
to = stack.pop()
else:
*to++ = *from++
break
// Anything else, just transfer.
default:
*to++ = *from++
// Terminate string at truncated position.
*to = '\0'
Это будет проходить через строку символ за символом, запоминая все позиции (
в стеке, но по-прежнему передавая символы.
Всякий раз, когда вы найдете символ )
, вы настраиваете указатель to
так, что начинаете перезапись с самого последнего символа (
, эффективно удаляя все внутри и включая раздел (...)
.