[c] przeszukiwanie tablicy

0

Witam mam problem z zadaniem który usuwa pewne znaki z ciągu jeśli zajdzie potrzeba(tzn skróca je).

Wiem iż w c++ za pomocą stringu istnieje funkcja s.erase(a, b)...

Moim pytaniem tu czy nie ma jakiejś funkcji która szybko by to wykonała w C.
Powiedzmy mamy ciąg "Witam_Was99"
I chcemy usunąć znak '_' i cyfry.

Można po prostu wczytać do nowej tablicy wszystkie wartości nie związane. Czy przesuwać dobre znaki na miejsce niechcianego.
Ale czy jest jakaś szybsza metoda czy funkcja??
Powiedzmy mamy do sprawdzenia tablice char [7000].

0

przy tak małych tablicach nie ma sensu tego optymalizować. użyj klasy string.

0

przepraszam miałem napisać [70000]

Chciałem to wykonać w C gdzie string nie istnieje.

W zadaniu mam podać ilość liter do których ciąg zostanie zmniejszony.
Na początku ma usuwać znak '_' potem cyfry następnie samogłoski od początku z pominięciem 1. A jeśli nadal nie pasuje to usuwać inne znaki od końca z pominięciem 1.
I zastanawiam się jak to szybko wykonać. Po kolei wystąpienia cyfr czy samogłosek nadmiernych zamieniałem na znak 32 czyli spacje, a potem wpisywałem do innej tablicy wszystko oprócz znaku spacji.

Ale to jest czasochłonne... zbytnio.

A można jakoś od razu usuwać znaki i przesuwać ciąg o jeden by ten wcześniejszy znak zostawał zamazywany poprzez znak znajdujący się od razu za nim?
Tak jak działa np. erase. teoretycznie

0

Nie istnieje? Huh, no to chyba coś ostatnimi czasy się zmieniło... więc już string.h nie mam na kompie?

0

Można po prostu wczytać do nowej tablicy wszystkie wartości nie związane. Czy przesuwać dobre znaki na miejsce niechcianego.
Oczywiście. I od tego należy zacząć. Jeśli program okaże się wystarczająco szybki, zostawić to tak.

Ale czy jest jakaś szybsza metoda czy funkcja??
kopiowanie nie pojedynczych bajtów, ale po cztery, czyli unsigned int

 czy tam <code noframe>unsigned long

. Żeby było przyspieszenie, każdy taki int musi mieć adres podzielny przez 4. Trzeba więc w miarę potrzeby kopiować pierwsze od 0 do 3 bajtów pojedynczo, tak samo na końcu.
Trzeba przy tym uważać na „strict aliasing violation”, bo ścisły standard C zabrania rzutowania np. char* na int* i grzebania po tych charach jako po intach. Można to przeskoczyć np. robiąc unię tablicy czterech charów i inta, następnie operowanie na tablicy tych unii, albo na wskaźniku do pierwszego inta i wskaźniku do pierwszego chara — aby nigdy nie rzutować jednego typu wskaźnika na drugi.

0

Chodzi o takie coś? Faktycznie zamazuje każdy znak za tym...

void erase(char* buf, int start, int len)
{
	char *hstart = buf + start;
	char *head = hstart + len;
	int i = 0;
	while(head[i])
	{
		hstart[i] = head[i];
		i++;
	}
	hstart[i] = head[i];
}

Ale dla ciepie powinno znacznie szybciej działać (pseudokod)

start = poczatek_napisu;
glowica = poczatek_napisu;
i = 0;
while(!koniec_napisu(glowica))
    if(znak_zaakceptowany(glowica))
        start[i] = glowica[i];
    else
        glowica++;
        start[i] = glowica[i];
    i++;

Jedna funkcja usuwająca wszystkie niechciane znaki.

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