Odstranění znaků z pole – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Odstranění znaků z pole – C / C++ – Fórum – Programujte.comOdstranění znaků z pole – C / C++ – Fórum – Programujte.com

 

Sprinter
~ Anonymní uživatel
102 příspěvků
26. 12. 2012   #1
-
0
-

Ahoj,

řeším v jazyku C takový problém - potřebuji odstranit mezery z pole. Jde mi o tohle, mám pole {A, $, B, C, $, $, $}, kde znak $ představuje mezeru. Já z tohoto pole potřebuji udělat toto {A, B, C}. Existuje na to nějaká funkce? Dočetl jsem se, že pro C++ by to měla být funkce erase(), ale pro jazyk C nevím...

Nahlásit jako SPAM
IP: 92.62.224.–
zlz
~ Anonymní uživatel
634 příspěvků
26. 12. 2012   #2
-
0
-

 Standardní funkce na to není. Můžeš to udělat třeba nějak takhle, snad je to samovysvětlující.

int pocetprvku = neco, novypocetprvku = 0;

for (int i = 0; i < pocetprvku; i++)
{
	if (pole[i] != ' ')
		pole[novypocetprvku++] = pole[i];
}
Nahlásit jako SPAM
IP: 80.188.216.–
Sprinter
~ Anonymní uživatel
102 příspěvků
26. 12. 2012   #3
-
0
-

#2 zlz

No tohle chápu, ale tímto způsobem právě dojde k chybě - pokud totiž podmínka neproběhne, do pole se neuloží nic.. stane se pak, že budu mít pole o (A, B, ?, C, ?)... kde otazník bude nějaký nevyžádaný znak.. např. i ukončovací a to mi může způsobit i ukončení řetězce - pole..

Nahlásit jako SPAM
IP: 81.90.168.–
zlz
~ Anonymní uživatel
634 příspěvků
26. 12. 2012   #4
-
0
-

No, chtěl jsi odstranit mezery. Pokud tam budou jen mezery, tak se tam nic "nevloží", to je přece žádoucí.

Pokud chceš jiný filtr, tak si tu podmínku nějak uprav.

if (isalpha(pole[i])) ...
if (isupper(pole[i])) ...
if (strchr("povoleneznaky", pole[i])) ...
Nahlásit jako SPAM
IP: 80.188.216.–
Sprinter
~ Anonymní uživatel
102 příspěvků
27. 12. 2012   #5
-
0
-

#4 zlz
Nastavení filtru chápu - v úseku kódu níže v podstatě používám filtr, který máte uvedený v posledním příspěvku. Ale jde mi o to, že tímto postupem se mi z pole_1 vytvoří pole_2 takto: 

pole_1 = {A, A, A, B, C, C, C}

pole_2 = {A,  ,   , B, C,  ,  ,  }

Ale já bych potřeboval, ale pole_2 vypadalo takto: {A, B, C}

Omlouvám se, pokud jsem Vás jen špatně pochopil...

int j;
	int k;
	char dup_line_buffer [strlen(line_buffer)];
	for (j = 0; j < strlen(line_buffer); j++)
	{
		dup_line_buffer[j] = ' ';
	}
	for (k = 0; k < strlen(line_buffer); k++)
	{
		if (strchr(dup_line_buffer, line_buffer[k]) == NULL)
		{
			dup_line_buffer[k] = line_buffer[k];
		}
	}
	dup_line_buffer[k] = '\0';
	printf("dup_line_buffer: %s\n", dup_line_buffer);
Nahlásit jako SPAM
IP: 92.62.224.–
vitamin+8
Grafoman
27. 12. 2012   #6
-
0
-

Mozes pouzit nieco taketo:

#include <stdio.h>
#include <stdlib.h>

int filter(const void* v1, const void* v2){
	if(*(const char*)v1 == ' ')return 1;
	return -1;
};
int main(){
    char str[] = "AAB  A  CC C B A  ";
    qsort(str, sizeof(str), sizeof(char), filter);
    
    printf(str);
    return 0;
}

Predpoklada to ale ze mas pole ukoncene s '\0' .

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Sprinter
~ Anonymní uživatel
102 příspěvků
27. 12. 2012   #7
-
0
-

#6 vitamin
Tak jsem použil Váš úsek kódu, k tomu přidal cyklus, který zbytek pole po seřazení uřízne a vše funguje jak má, děkuji. Akorát bych se ještě zeptal na funkci filter() - jsem v C začátečník a tak moc nechápu, proč je na konci funkce středník? A dále co znamená const void či const char (const)?

Nahlásit jako SPAM
IP: 92.62.224.–
vitamin+8
Grafoman
27. 12. 2012   #8
-
0
-

Ten strednik je tam uplnou nahodov, kludne ho zmaz :)

Ten moj kod pouzi az ked si uz vobec nebudes vediet rady (je relativne pomaly a funkcia qsort sluzi na uplne ine veci).

Ked si zaciatocnik, tak sa zatial nepokusaj pochopit parametrom funkcie filter.

Pre teba bude asi najlahsie vytvorit si pomocne pole do ktoreho prekopirujes vsetky znaky (okrem ' ') a potom len cez strcpy() prekopirujes obsah pomocneho pola spet do povodneho. Neskor to mozes spravyt aj bez pomocneho pola (to je trochu zlozitejsie)

edit: tak bez pomocneho pola je to este jednoduhsie ako s nim :)

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Sprinter
~ Anonymní uživatel
102 příspěvků
27. 12. 2012   #9
-
0
-

#8 vitamin
Tak jsem při testování zjistil, že ten postup s použitím funkce filter() v určitých případech nefunguje.. Při určitých vstupech to některé znaky vyhodí.. Co se týče toho postupu s pomocným polem, tak ten už jsem zkoušel - problém ale je, že pokud použiji for cyklus, tak se mi vždy budou do pomocného pole kopírovat i znaky které nechci (leda napřed použít for cyklus na nulování, ale pak bych se opět dostal k případu {A, 0, 0, B})...

Nahlásit jako SPAM
IP: 92.62.224.–
vitamin+8
Grafoman
27. 12. 2012   #10
-
0
-

#8 vitamin
Ziadne nulovanie netreba:

#include <stdio.h>

int main(){
    char str[] = "AAB  A  CC C B A  ";

    
    char *set = str;
    for(char *get = str; *get != '\0'; ++get ){
	if(*get != ' '){
	    *set = *get;
	    ++set;
	}
    }
    *set = '\0';
    
    
    printf(str);
    return 0;
}
Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Sprinter
~ Anonymní uživatel
102 příspěvků
27. 12. 2012   #11
-
0
-

#10 vitamin
Vím, že už to asi bude vypadat, že si vymýšlím, ale při překladu mi to hodilo chybu, že prý ten for cyklus není kompatibilní s ANSI C, ale pouze s C99 (přiznám se, for cyklus bez intů vidím prvně :-)).. Bohužel práci kterou píšu musí být v ANSI .. je možné to nějak provést i v ANSI?

Nahlásit jako SPAM
IP: 92.62.224.–
vitamin+8
Grafoman
27. 12. 2012   #12
-
0
-

Ty to prekladas v standarte c89/c90 (z roku 1989/1990    ). Prepni si prekladac do c99 (1999) alebo c11 (2011). Vsetko su to standarty ansi c.

V gcc napr. takto:

-std=c11 

Nahlásit jako SPAM
IP: 95.105.157.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Sprinter
~ Anonymní uživatel
102 příspěvků
27. 12. 2012   #13
-
0
-

#12 vitamin
Aha :-) .. tak po správném překladu to už funguje jak má, děkuji.

Nahlásit jako SPAM
IP: 92.62.224.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 14 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý