Chyba při nahrazení a posunutí prvků v poli – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Chyba při nahrazení a posunutí prvků v poli – C / C++ – Fórum – Programujte.comChyba při nahrazení a posunutí prvků v poli – C / C++ – Fórum – Programujte.com

 

Wannabie
~ Anonymní uživatel
8 příspěvků
9. 12. 2011   #1
-
0
-

Ahoj, chci z načteného řetězce odstranit prvky (zde např. 'x' a 'w') a zbývající prvky za nimy posunout. Bohužel, se tak neděje správně - prvky se neposunou a na kontrolním výstupu při zadání "awhxoj" se vypíše "awhx". Velikost pole se zmenší ze 6 na 4 ale už ne méně pokud vstup obsahuje více znaků 'x' nebo 'w'. Hádám, že tam bude jak syntaktická tak algoritmická chyba. :/

 int velikost = strlen(str1);


 for(int p = 0; p < velikost; p++)
 {
   if(str1[p] == 'x' || str1[p] == 'w')
   {
      for(int v = p; v < velikost; v++)
      {
        str1[v] = str1[v++];
      }
      velikost--;
   }


 }

 printf("\nDelka po upravach: %d\n", velikost);

 for(int g = 0; g < velikost;g++)
 {
     printf("%c",str1[g]);
 }
Nahlásit jako SPAM
IP: 88.103.137.–
KIIV
~ Moderátor
+43
God of flame
9. 12. 2011   #2
-
0
-

doporucuju nastudovat jak funguje  v++ a ++v (post inkrementace a pre-inkrementace)

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
crazy
~ Moderátor
+10
Grafoman
9. 12. 2011   #3
-
0
-

#1 Wannabie

int velikost = strlen(str1);


 for(int p = 0; p < velikost; p++)
 {
   if(str1[p] == 'x' || str1[p] == 'w')
   {
      for(int v = p+1; v < velikost; v++)
      {
        str1[v-1] = str1[v];
      }
      velikost--;
   }


 }

 printf("\nDelka po upravach: %d\n", velikost);

 for(int g = 0; g < velikost;g++)
 {
     printf("%c",str1[g]);
 }
Nahlásit jako SPAM
IP: 89.190.90.–
All you need is vision and time.
KIIV
~ Moderátor
+43
God of flame
9. 12. 2011   #4
-
0
-

#3 crazy
myslis ze ti to bude fungovat treba s retezcem "axbxcxdx" ?

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Wannabie
~ Anonymní uživatel
8 příspěvků
9. 12. 2011   #5
-
0
-

#4 KIIV

Tak jsem vyzkoušel na pár místech pre-inkrementaci a nakonec došel ke stejnému řešení jako crazy. Díky vám oběma chlapi, měl bych si dát větší pozor na takovéhle základní chyby.

Ano, funguje to i pro "axbxcxdx".

Nahlásit jako SPAM
IP: 88.103.137.–
KIIV
~ Moderátor
+43
God of flame
9. 12. 2011   #6
-
0
-

a co kdyz das vypsat printf("%s\n",str1); ?

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
crazy
~ Moderátor
+10
Grafoman
9. 12. 2011   #7
-
0
-

j pro takovýhle případ by se musel na konec doplnit nulový znak... '\0'

Nahlásit jako SPAM
IP: 89.190.90.–
All you need is vision and time.
vitamin+8
Grafoman
9. 12. 2011   #8
-
0
-

#5 Wannabie
Skus si tam zadat "axxbxxc". Ked narazis na prve 'x', tak posunies zvysok retazca. Lenze na miesto povodneho 'x' vlozis nasledujucu hodnotu ktora je v tomto pripade zas 'x'. Kedze vo for-e inkrementujes p tak toto dalsie 'x' uz netestujes a ostane ti v retazci.

Nahlásit jako SPAM
IP: 95.105.128.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
crazy
~ Moderátor
+10
Grafoman
9. 12. 2011   #9
-
0
-

#8 vitamin
máš pravdu... bude to chtít ještě dekrementovat p

char str1[] = "Axxbxcxdx";
    int p, v, g;
int velikost = strlen(str1);


 for(p = 0; p < velikost; p++)
 {
   if(str1[p] == 'x' || str1[p] == 'w')
   {
      for(v = p+1; v < velikost; v++)
      {
        str1[v-1] = str1[v];
      }
      velikost--;
      p--;
   }


 }
 str1[velikost] = '\0';

 printf("\nDelka po upravach: %d\n", velikost);

     printf("%s\n",str1);
    return 0;
Nahlásit jako SPAM
IP: 89.190.90.–
All you need is vision and time.
vitamin+8
Grafoman
9. 12. 2011   #10
-
+1
-
Zajímavé

 
Ten algoritmus ma ale dost velku zlozitost (je pomaly). Da sa napisat jednoduzsi algoritmus ktori nepozuiva strlen() a na spracovanie retazca mu staci 1 prechod cez cele pole(retazec).

	char *a, *b;
	for(a= b= str1; *b != '\0'; b++){
		if(*b != 'x' && *b != 'w'){
			*a = *b;
			++a;
		}
	}
	*a = '\0';
Nahlásit jako SPAM
IP: 95.105.128.–
obfuscate: "The cruel god Malloc will strike you down. "
ZMeson: "That's the C god. C++ has a new god. "
Wannabie
~ Anonymní uživatel
8 příspěvků
10. 12. 2011   #11
-
0
-

Whow, pěkné úpravy. Z těch vylepšení jsem se hned něco naučil. :-D  Všem díky za pomoc. 

Nahlásit jako SPAM
IP: 88.103.137.–
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, 42 hostů

Podobná vlákna

Nahrazení znaku v byte poli — založil trambo

Sčítání prvků v poli — založil vazbok

Počet prvků v poli — založil Hmm

Třízení prvků v poli — založil Marek

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ý