| Autor | Správa |
street_punk
 Užívateľ
 Založený: 09.04.2011 Príspevky: 237 Bydlisko: Kesa Vek: 22
 | Zaslal: Ut 31.01.12 12:51 |   |
Mám spraviť program, do ktoréhoho napíšem nejaký reťazec a vynechá mi medzeri. Zatial mi napadli 3 možnosti ako to spraviť.
1. Ošetriť to rovno pri načítavaní poľa (primitívne riešenie a podľa mňa by sa to tak nemalo robiť, lebo úlohou je načítať reťazec a z neho bynechať medzeri)
2. Vytvoriť si pomocný reťazec, kde prepíšem písmená bez medzier (toto je už dobré riešenie, ale zabere to viac času programu)
3. Ošetriť to rovno v tom reťazci. A tu mám ten problém, že mi to aj spraví, ale logicky mi tam zostanú zvyšné písmená (o koľko medzier sa posunie, toľko písmen zostane). Napríklad keď zadám ja som clovek, tak mi vypíše jasomclovekek. Myslel som si, že keď tam zadám nulový znak (podľa mňa by tam mal byť už, lebo pri načítavaní pola je, tak sa mi zvyšok roťazca zmaže.
| kód: | #include <stdio.h>
#include <stdlib.h>
#define max 30
int nacitanie(char pole[]);
void vypis(char pole[], int dlzka);
void vynechanie_medzier(char pole[], int dlzka);
int main()
{
char pole[max];
int dlzka;
dlzka = nacitanie(pole);
vynechanie_medzier(pole, dlzka);
vypis(pole, dlzka);
putchar('\n');
system("pause");
return 0;
}
int nacitanie(char pole[])
{
int i;
char pom;
for(i = 0; i < max - 1; i++)
{
pom = getchar();
if(pom == '\n')
break;
pole[i] = pom;
}
pole[i] = '\0';
return i;
}
void vypis(char pole[], int dlzka)
{
int i;
for(i = 0; i < dlzka; i++)
putchar(pole[i]);
}
void vynechanie_medzier(char pole[], int dlzka)
{
int i = 0, j = 0;
for(i = 0, j = 0; i < dlzka; i++, j++)
{
if(pole[i] == ' ')
{
pole[j] = pole[i + 1];
i++;
}
pole[j] = pole[i];
}
//tu som si neni isty, ci mi ponechal aj 0 znak
} |
|
_________________ NB - HP Pavilion DV7 3190 -- Windows® 7 Home Premium 64-bit -- Intel® Core™ i7-720QM 1,6 GHz az 2,8 Ghz Turbo Boost, 6 MB pamäte cache úrovne 2 -- 4 GB DDR3 -- disk 640 GB SATA 5400 ot/min -- rozlíšenie 1600 x 900 -- NVIDIA® GeForce® GT 230M -- 2 815 MB grafickej pamäte s vyhradenou pamäťou 1 GB DDR3 -- pripojenie 802.11 a/b/g/n | |
  |
 |
Fico
 Skúsený užívateľ
 Založený: 11.01.2009 Príspevky: 1052
 | Zaslal: Ut 31.01.12 14:03 |   |
Sprav to takto, je to jednoduchsie:
| kód: | void vynechanie_medzier(char pole[], int dlzka)
{
int i, j;
for( i = 0; i < dlzka; i++ )
{
if ( pole[i] == ' ' )
{
for ( j = i; j < dlzka; j++ )
pole[j] = pole[j + 1];
i--; /* ak je nasledujuci znak opat medzera, treba sa vratit na tento index */
}
}
} |
Jednoducho ak najdes medzeru, cely string za nou ( vratane koncovej nuly ) presun o jednu poziciu. A takymto sposobom ti to bude fungovat aj v pripade, ze napises viacero medzier za sebou. |
| |
   |
 |
street_punk
 Užívateľ
 Založený: 09.04.2011 Príspevky: 237 Bydlisko: Kesa Vek: 22
 | Zaslal: Ut 31.01.12 14:48 |   |
Díky, ide to. Ja som robil tú chybu, že som neposúval celý reťazec, ale len jednotlivé písmená, čiže mi vždy na konci zostali vystavačné. |
_________________ NB - HP Pavilion DV7 3190 -- Windows® 7 Home Premium 64-bit -- Intel® Core™ i7-720QM 1,6 GHz az 2,8 Ghz Turbo Boost, 6 MB pamäte cache úrovne 2 -- 4 GB DDR3 -- disk 640 GB SATA 5400 ot/min -- rozlíšenie 1600 x 900 -- NVIDIA® GeForce® GT 230M -- 2 815 MB grafickej pamäte s vyhradenou pamäťou 1 GB DDR3 -- pripojenie 802.11 a/b/g/n | |
  |
 |
|
Nemôžete pridávať nové témy do tohto fóra. Nemôžete odpovedať na témy v tomto fóre. Nemôžete upravovať svoje príspevky v tomto fóre. Nemôžete mazať svoje príspevky v tomto fóre. Nemôžete hlasovať v tomto fóre.
|
|