Usuwanie części treści stringa w nawiasach

0

Witam
mam do napisania funkcję, która wskaźnik na łańcuch znaków, wskaźnik na ciąg wyjściowy. Moi zadaniem jest napisać kod do usuwania części stringa, która jest w nawiasie np example(jakiś tekst)example ma zwrócić exampleexample, nawiasy nie są zagnieżdżone i nie występują więcej niż raz. poniżej kod

void remove_parentheses(const char *str_in, char *str_out) {
                int i, j, z, k;
        for (i = 0; str_in[i] != '('; i++);
        for (j = strlen(str_in - 1); str_in[j] != ')'; j--);
        for (k=0, z = 0; z<strlen(str_in); z++)
                       if(z<i||z>j)
                str_out[k++] = str_in[z];
        str_out[k] = '\0';
}

Serwer mi tego nie przyjmyje. Poniżej opis błędu
string:

"example(unwanted thing)example"

Submitted:

"example(unwanted thing)example"

Expected:

"exampleexample"

Może ktoś pomóc?

2

strlen(str_in - 1) -> strlen(str_in) - 1

4
strlen(str_in - 1)

Chcesz odjąć od wyniku funkcji, a nie przesunąć wskaźnik.

Nie wywołuj strlen w warunku funkcji - będziesz to wykonywał za każdym obiegiem funkcji.

Ogółem kod jest trochę przekombinowany. Rozważ:

void remove_parentheses_kq(const char* in, char* out)
{
    while(*in && *in != '(')
        *out++ = *in++;
    while(*in && *in != ')')
        in++;
    while(*in++)
        *out++ = *in;
}
0

Dziękuję. Poprawiłem i poszło. Ale dlaczego dawało prawidłowe wyniki w VisualStudio? Jak można zrobić to prościej?

0

Bo pewnie przed miałeś jakiś znak i nie naruszałeś ochrony pamięci bo byłeś zbyt blisko. Serdecznie polecam pierw kompilację na linuksie z użyciem address sanitizera.

A prostszą imo wersję dałem wyżej

2

Ja bym to zrobił jakoś tak (kod nietestowany):

#define _GNU_SOURCE
#include <string.h>

void remove_parentheses(const char *str_in, char *str_out) {
    const char* open_paren = strchrnul(str_in, '(');
    assert(*open_paren == '(');
    const char* close_paren = strchrnul(open_paren, ')');
    assert(*close_paren == ')');
    strncpy(str_out, str_in, (open_paren - str_in));
    strcpy(str_out + (open_paren - str_in), close_paren + 1);
}
0

Dzięki

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0