Funkcja usuwająca niechciane znaki z tablicy

0

Mam taką funkcyjkę

void odsiew (char* ciag)
{
	int i = 0;
	int j = 0; 
	while ((*(ciag + i) = *(ciag + j++)) != '\0')
		if (isalpha(*ciag + i))
			i++;
}

Jej zadanie jest proste: usunąć z tablicy to co nie jest literą. Utrudnienie: notacja tylko wskaźnikowa i bez tworzenia drugiej tablicy.
i - indeks elementu przepisywanego - tego, który ma zostać
j - elementu odczytywanego

0
void odsiew (char* ciag)
  {
    for(char *p=ciag;(*p=*(ciag++))!=0;p+=isalpha(*p)) {}
  }
0

Niestety efekt podobny. Ale argumenty pętli for czarodziejskie ;)

0
bool isnchar(char c) { return !ischar(c); }
remove_if(ciag, ciag + strlen(ciag), isnchar);
0

Tak, sprawdzanie znaków po kolei i zwracanie "prawdy" to jest rozwiązanie. Ale idea polegała na wysłaniu wskaźnika do funkcji i tam przemielenie tego znak po znaku bez zakładania tymczasowej tablicy, z której potem łatwo bym to przekopiował. Takie tam sobie utrudnienie życia coby nabrać wprawy w operowaniu wskaźnikami do tablic znakowych :)

0

A to co ja dałem to nie spełnia tych wymagań? Nawet masz tam arytmetykę wskaźników.

0

Do funkcji przesyłasz pojedynczy znak przy każdym kroku i sprawdzasz czy jest true/false. Taką wartość zwracasz i dopiero potem wykonujesz operacje na tablicy.
Funkcja, którą wstawiłem na początku wątku wydaje mi się powinna działać, a jednak tak nie jest. Nie szukam rozwiązania zadania do szkoły (na przykład), to raczej "problem".
W ramach wyjaśnienia - ja sobie po prostu piszę, nazwijmy to nauką od nowa (15 lat nie programowałem). Wymyślam zadania i staram się je rozwiązywać. Przydałby się zestawik zadań do pisania: wykorzystanie wskaźników, funkcji, szablonów itd. Brak mi pomysłów, a zadanka algorytmiczne z olimpiad i konkursów...

0

Nie rozumiem czym ci nie pasują twoje lub moje rozwiązanie?

0

Dragon, Twoje odpaliłem na MS Visual 2005 i nie poszło, tzn, nie "odsiewa" wszystkiego, podobnie jak to co ja spłodziłem, ale jej definicja jest naprawdę świetna. Może widzisz u mnie błąd po prostu?

0

Ale gapa ze mnie i u ciebie błąd i u mnie błąd :-D

void odsiew(char *ciag)
  {
   int i=0;
   int j=0; 
   while ((*(ciag+i)=*(ciag+j++)) != 0)
      if (isalpha(*(ciag+i))) // tu brakowało nawiasów, sprawdzało nie ciag[i] zaś ciag[0]+i
         ++i;
  }
void odsiew(char *ciag)
  {
   for(char *p=ciag;(*p=*(ciag++))!=0;p+=(isalpha(*p)>0)) {} // isalpha - zwraca: 0 - nie litera, 1 - duża litera, 2 - mała litera, p przeskakiwało o 2
  }
0

Dzięki za podpowiedź :) Przegapiłem ten nawiasik

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