Autor Zpráva
peterson
Profil *
zdravim :( jsem uz zoufaly. neumite mi poradit? potrebuji zjistit jesli jsou vsechny znaky v retezci cisla nebo ne. no a uvnitr mainu mi to frci v pohode, ale kdys to dam do funkce tak to nejde. vim ze se to da udelat cez pointre ale neumim je a tak by se to ale mnelo dat udelat i bez nich ne? dekuji :(

int overenie_ciselneho_retazca(char znak) {
     
         int i, dlzka_retazca;
         int spravnost_znakov = -1;

         dlzka_retazca = strlen(znak)-1;

         for (i=0;i<=dlzka_retazca;i++) {
             if (znak[i]>=48 && znak[i]<=57) {
             spravnost_znakov++;
             }
         }
         
         if (spravnost_znakov == dlzka_retazca) {
         return 1;                     
         } else {
         return 0;       
         }
         
}

int main () {
    
         char znak[50];
         
         printf("zadaj znak: ");
         scanf("%s",&znak);
         
         if (overenie_ciselneho_retazca(znak)) { 
         printf("je znak");
         } else {
         printf("nie je znak");
         }
         
         
         sleep(60000);
         return 0;
}

Moderátor Alphard: Obarvil jsem to jako javascript, syntakticky je asi nejbližší z těch, co tady máme.
mckay
Profil
peterson:
Obávám se, že tady vám s tímhle tím asi nikdo neporadí, fórum se specializuje na webdesign, nikoliv na programování jako takové. Jinak pro příště by bylo moudré vkládat kód aspoň mezi , bylo by to pro případného programátora snazší na pochopení.
Yur4Y
Profil
Nebude chyba v deklarácii funkcie?
int overenie_ciselneho_retazca(char znak[50])
Nox
Profil
mckay
ale jo ;)

Yur4Y
to je trochu restriktivní deklarace...

peterson:
jesli jsou vsechny znaky v retezci cisla nebo ne
z toho vyplývá když je tam znak co není číslo, tak se vrací false, tzn spravnost_znakov nema smysl;

'char znak' podle mě značí jen znak...navíc je to divné pojmenování když to má být řetězec, takže já bych to napsal jako:

funkce:
int isStrNumeric(char *str){
	int i, length = strlen(str);

	for(i=0;i<length;i++, str++)
		if (*str<48 || *str>57)
			return 1;

	return 0;
}

v main:
if( isStrNumeric(&znak))...


sleep(60000) ...co to?
vynalezce
Profil
Místo
sleep(60000);
je lepší použít
system("pause");
Nox
Profil
když programuju v CodeBlocks tak se program neuzavře a minimálně bych to dal podmíněně buď parametrem programu nebo konstantou, třeba i preprocesorovou podmínkou,
protože použití ať sleep nebo pause podle mě nepříjemně ovlivní řetězení aplikací nebo takové věci - posílání výstupu jednoho programu do druhého

...čehož se podle mě i využívá při hromadném automatickém opravování na školách....
Joker
Profil
Nox:
sleep(60000) ...co to?
Třeba to bez toho je příliš rychlé :-) Takové to klišé hlavně na straně zákazníků, že většina systémů někde uvnitř obsahuje zahrabanou takovouhle konstrukci a následné optimalizace rychlosti spočívají ve snižování toho čísla :-)

nepříjemně ovlivní řetězení aplikací nebo takové věci
Jakým způsobem? To by mě zajímalo.
Nox
Profil
No myslel jsem že to prostě zpomalí celý proces že ty další programy budou muset čekat... a v případě "pause" nevím co by se stalo, jestli by se to vůbec dokončilo. Nemám s tím zkušenost, jen mě to napadlo
imploder
Profil
peterson:
Stačí v deklaraci přidat hvězdičku:
int overenie_ciselneho_retazca(char *znak) {

To znamená, že parametr je typu ukazatel na char. Pak to funguje.

Když jsi deklaroval
char znak[50];
tak tím vzniklo pole o délce 50 bajtů a samotný znak (bez hranatých závorek) je ukazatel na začátek toho pole.

V Cčku jsou pole a ukazatele kompatibilní, můžeš předat pole jako ukazatel a funguje to - ukazuje na první prvek pole. K dalším prvkům se dá přistupovat indexem v hranatých závorkám stejně jako přičítáním ofsetu v paměti. Když mám
int pole[20]
pak zápis
pole[4]
je ekvivalentní
*(pole+4*sizeof(int))
- obojí je hodnota 5. prvku pole.

Jde takhle nadeklarovat pole a používat ho pak jako ukazatel, úplně "stylisticky" čisté to asi není, překladač v takovém případě hodí warning.
> gcc -std=c99 -Wall -g znak.c
znak.c: In function `main':
znak.c:30: warning: char format, different type arg (arg 2)

Ale funguje to bez problémů.

EDIT: tento problém se řeší i na rootu: http://www.root.cz/diskuse/4881/
_es
Profil
Yur4Y:
int overenie_ciselneho_retazca(char znak[50])
To by asi vyvolalo chybu alebo by to vôbec nefungovalo.
Dalo by sa použiť:
int overenie_ciselneho_retazca(char znak[])
čo je úplne to isté ako
int overenie_ciselneho_retazca(char *znak)

imploder:
pak zápis
pole[4]
je ekvivalentní
*(pole+4*sizeof(int))
- obojí je hodnota 5. prvku pole.
Nie, správne má byť druhý výraz:
*(pole+4)

peterson:
Našiel som ti: Jazyk C, řetězce
Nox
Profil
_es:
To by asi vyvolalo chybu alebo by to vôbec nefungovalo.
Ono to funguje, spustilo se to a myslím že to i jelo, samozřejmě je to ale špatný nápad
imploder
Profil
_es:
imploder:
pak zápis
pole[4]
je ekvivalentní
*(pole+4*sizeof(int))
- obojí je hodnota 5. prvku pole.
Nie, správne má byť druhý výraz:
>
*(pole+4)
Přečti si to prosímtě ještě jednou: je to příklad pole intů, ne charů. Int má v 32-bitových systémech typicky velikost 4 bajty, minimum je 2 bajty (v DOSu).

http://stackoverflow.com/questions/589575/c-size-of-int-long-etc
http://bytes.com/topic/c/answers/703329-size-integer-depends-word-lenght-os

Operátor sizeof zjistí velikost daného typu v prostředí, kde se překládá a tady tak dosadí nejspíš 4 (takže se přičte 4*4=16). Pokud mají prvky pole velikost 1 bajt (typ char takovou mívá), tak by *(pole+4) fungovalo. Nevím o tom, že by někde měl char jinou velikost než 1 bajt, ale i tak je v zájmu přenositelnosti programu lepší používat sizeof. Je to nejen správné, ale i doporučované.
_es
Profil
imploder:
Nie, v C je pointer vždy nejakého typu, teda v tvoje ukážke:
int pole[20];
pointer pole ukazuje na prvý prvok poľa 20 prvkov typu int idúcich v pamäti za sebou a ten pointer je typu "pointer na dátový typ int".
A zápisy pole[4] a *(pole+4) sú ekvivalentné.
Tak, ako je nesprávne pole[4*sizeof(int)], tak isto je nesprávne *(pole+4*sizeof(int)).
Timy
Profil
_es má pravdu, pokud kompilátor ví, že je pointer ukazuje na int, tak při zápisu *(pole + 5) se automaticky posune o 5*sizeof(int) bajtů dál, tedy na šestý prvek pole. Lze to snadno ověřit:

int pole[10];
int i;
for(i=0; i<10; i++)
	pole[i] = i;
printf("res: %d\n", *(pole + 5));


Vypíše to res: 5.

..nebo disassembler :-).
imploder
Profil
_es:
Je to tak, jak říkáš: pole[4] a *(pole+4) jsou ekvivalentní. Omlouvám se za šíření bludu.
Tady je takový příklad s obrázkem: http://www.eskimo.com/~scs/cclass/notes/sx10b.html
http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/BitOp/pointer.html

Vaše odpověď

Mohlo by se hodit

Zvažte, zda se neobrátit na specializované fórum, toto se zabývá především webovou problematikou.

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: