Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno funkce pro smazání znaku v poli, a převod char do int bez použití funkce (C)

Ahoj, nemůžu přijít na to jak vymazat nějaký znak z pole char. Mám zadané číslo třeba 0000530020 a potřebuju aby ty nuly na začátku tam nebyly. Udělal jsem to tak, že podmínkou zkouším jestli je na začátku nula a když jo, tak všchny znaky posunu o jeden dopředu(nulu to přepíše), ale na poslední místo kde by nemělo být nic to uloží nevím co, a ve výsledku to tam potom vypisuje nějaké divné symboly..
Teda teď jsem zjistil, že někdy to vyplní i zadané číslo pokud není plné to pole.
Mám nastavené char str[20] a když zadám číslo které nemá 20 číslic tak to vyplní zbytek nějakýma symbolama(nemůžu použít dynamický rozměr)

A druhý problém, neporadil by mi někdo jak převést tento řetěc čísel(znaků) na jedno číslo. Bohužel mám zadáno načítat znaky po jednom, takže scanf a podobné nemůžu. A funkci jako atoi a podobné taky nemůžu použít. Prosím o radu děkuju.

Předmět Autor Datum
uz som dlho v C a ani C++ neprogramoval a ani ho uz nemam nainstalovane, takze nemozem odskusat ci n…
IgorK 25.09.2011 19:33
IgorK
Musis posunut aj ten zakoncovaci znak ktory je na konci retazca. Je to nulovy bajt., da sa oznacit a…
MM.. 25.09.2011 23:45
MM..
.. ak by ste sa nahodou este neucili pointre, tak potom napr. (je to ale menej efektivne): int i,j;…
MM.. 26.09.2011 00:05
MM..
A druhý problém, neporadil by mi někdo jak převést tento řetěc čísel(znaků) na jedno číslo. Bohužel…
MM.. 25.09.2011 23:48
MM..
... ked to mas do skoly zadane ze po jednom znaku tak skus zapojit mozog, je to tvoja domaca uloha a…
MM.. 25.09.2011 23:51
MM..
ja som pochopil preco tam nesmie mat atoi a to podla mna kvoli tomu aby pochopili ako vnutorne precu…
IgorK 26.09.2011 09:24
IgorK
Díky všem za rady, podařilo se mi včera oboje tak nějak vyřešit. Ty symbloy stačilo na začátku to po… poslední
.pata. 26.09.2011 19:32
.pata.

uz som dlho v C a ani C++ neprogramoval a ani ho uz nemam nainstalovane, takze nemozem odskusat ci nepisem bludy.
1, co sa tyka prvej otazky, nemozes to robit dynamicky cez smerniky a alokovat si dynamicky pamat? ak nie, tak zacni citat znaky len odtial kde uz 0 nie je a nie sa ju snazit odstranit. cim by si ju nahradil, kedze to mas definovane ako staticke pole?
2, toto nefunguje?:
char digit = '7';
int num = digit - '0';
ak sa nemylim, tak vnutorne sa v C a C++ robi so znakmi ako int ASCII, takze by to malo fungovat.

Musis posunut aj ten zakoncovaci znak ktory je na konci retazca. Je to nulovy bajt., da sa oznacit aj ako '\0'. P.S. Vsetko ostatne co je za nim je nepodstatne. tym char [20] si len vyhradis 20 bajtov pamate, ale na nic ine sa to cislo 20 nepuzije, je to len tvoje vyhradene miesto. String konci nulovym bajtom a teda dlzka stringu v C je vzdy "dynamicka" (od pointra az po prvy nulovy bajt).
napr.

char *p1, *p2;
p1 = p2 = nejakyretazec;
while(*p1=='0') p1++;  // hladanie prveho znaku ineho ako '0'
if(p1!=p2)
{
  while(*p1!='\0') // kopirujeme az po zakoncovaci znak
    *p2++ = *p1++;
  *p2 = '\0';      // a pridame zakoncovaci znak
}

Inac namiesto cyklu mozes pouzit aj fciu memmove, ktora je schopna spravne kopirovat aj bloky ktore sa prelinaju, ak mas znamu dlzku retazca a pri dlhych kopirovanych blokoch je efektivnejsia. Ale pri vypocte dlzky kopirovaneho bloku pamatat aj na ten zakoncovaci nulovy bajt, a na to ze ked pouzivas unicode stringy (tchar apod) tak je jeden znak 2 bajty, v tom pripade vzdy pouzivat vo vypocte dlzky bloku aj sizeof(tchar) apod.

.. ak by ste sa nahodou este neucili pointre, tak potom napr. (je to ale menej efektivne):

int i,j;
i = 0;
while(retazec[i]=='0') i++;  // hladanie prveho znaku ineho ako '0'
if(i!=0)
{
  for(j=0; retazec[i]!='\0'; i++,j++)
    retazec[j] = retazec[i];
  retazec[j] = '\0';
}

A druhý problém, neporadil by mi někdo jak převést tento řetěc čísel(znaků) na jedno číslo. Bohužel mám zadáno načítat znaky po jednom, takže scanf a podobné nemůžu. A funkci jako atoi a podobné taky nemůžu použít.

preco by si nemohol pouzit atoi? To normalne funguje na string typu char[], a funguje spravne.

... ked to mas do skoly zadane ze po jednom znaku tak skus zapojit mozog, je to tvoja domaca uloha a nie moja (ja to viem a nepotrebujem si to cvicit).
Uvazuj jak by si to robil ty v hlave keby ti niekto diktoval cifry? Odpoved - drzal by si si v pamati nejaky integer a pri kazdej dalsej cifre by si ho vynasobil *10, a pripocital novu cifru (ak sa citaju cifry po jednej zlava doprava).

ja som pochopil preco tam nesmie mat atoi a to podla mna kvoli tomu aby pochopili ako vnutorne precuje char. a ze to je v podstate integer ASCII, cize na cislach by to malo normalne fungovat. cize ak napiseme zapis:
char digit = '7'; // '7' vnutorne je ASCII integer 55
int num = digit - '0'; // '0' vnutorne je ASCII integer 48, cize: 55-48 = 7 a mame char digit prevedene na int num
samozrejme ze vysvetlenie patri pre dotazovatela, tebe to vysvetlovat nemusim. :)

Díky všem za rady, podařilo se mi včera oboje tak nějak vyřešit. Ty symbloy stačilo na začátku to pole definovat "" jako prázné a plus dokopírovat ten znak ukončovací a..
a převádění čísel už jsem pak taky vymyslel. děkuju moc za odpovědi

Zpět do poradny Odpovědět na původní otázku Nahoru