Zdravím,
Dělám program do školy, ale nějak mi to nejede. Když zapnu program, poprvé projede dobře, ale když dám opakovat (stisknu A), tak už mi nenajede na zadávání retezce1. Jestli někdo víte jak na to, tak PLS poraďte. Dík moc
[list=]#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void remchar(char *s, char c);
char konec;
//______________odpogram_________________________________
void remchar(char *s, char c)
{
char *pom=s;
int i=0;
int j=0;
while(*(s+i)!='\0')
{
if(*(s+i) != c) {
*(pom+j) = *(s+i);
j++;
}
i++;
}
*(pom+j) = '\0';
}
//___________hlavni program______________________________
int main(int argc, char *argv[])
{
int h, delka;
char retezec[80], retez[80], a[1];
do{
system("cls");
printf("Zadej retezec1: ");
gets(retezec);
printf("\n");
printf("Zadej retezec2: ");
gets(retez);
printf("\n");
printf("\n ---- MENU ---- \n");
printf("1 - delka retezcu\n");
printf("2 - vymazani znaku z retezcu\n");
printf("3 - porovnani dvou retezcu\n");
printf("4 - kopirovani retezcu\n");
printf("5 - spojeni dvou retezcu\n");
printf("co chces robit: ");
scanf("%d", &h);
printf("\n");
switch (h) {
case 1: {
};break;
case 2: {char a;
printf("zadej znak na vymazani: ");
scanf("%s",&a);
remchar(retezec, a);
printf("retezec1 bez znaku %c : %s\n", a, retezec);
remchar(retez, a);
printf("retezec2 bez znaku %c : %s\n", a, retez);
};break;
case 3: {if (strcmp(retezec, retez)!=0)
printf("retezce jsou ruzne\n");
else
printf("retezce jsou totozne\n");
};break;
case 4: {printf("do retezce1 byl zkopirovany retezec2\n");
strcpy(retezec, retez);
printf("vypis retezec1: %s\n",retezec);
};break;
case 5: {char str[170];
strcat(str, retezec);
strcat(str, retez);
puts(str);
};break;
default: printf("mas jenom 5 voleb\n");break;
}
printf("pro opakovani stiskni A: ");
scanf("%s", &konec);
}while(konec == 'A');
}
[/list]
chyba v programu
-
- nováček
- Příspěvky: 1
- Registrován: listopad 10
- Pohlaví:
- Stav:
Offline
Re: chyba v programu
Jenom první nápad... určitě mačkáš "A"? Nemačkáš třeba "a"? Zkus tam do té podmínky napsat
while(konec=='a' || konec =='A');
while(konec=='a' || konec =='A');
I believe in winners and loosers and in freedom to fail
- domitea
- Tvůrce článků
-
Level 4.5
- Příspěvky: 1966
- Registrován: červen 09
- Bydliště: Královehradecký kraj
- Pohlaví:
- Stav:
Offline
- Kontakt:
Re: chyba v programu
1) While se takto nepíše - provádí pouze kód, který je v závorkách - což zde není
2) Tam kde chceš, aby se to začalo opakovat napiš
3) Místo while napiš
Ten while tam nemá vůbec smysl, jistě má se to opakovat, ale je tu také příkaz GoTo, kterým vlastně taky zajistíš opakování . Nebo to celé dát do funkce a poté jen porovnávat a volat
2) Tam kde chceš, aby se to začalo opakovat napiš
Kód: Vybrat vše
pokracuj: ;
3) Místo while napiš
Kód: Vybrat vše
if(konec=='a' || konec =='A')
{
goto pokracuj;
}
Ten while tam nemá vůbec smysl, jistě má se to opakovat, ale je tu také příkaz GoTo, kterým vlastně taky zajistíš opakování . Nebo to celé dát do funkce a poté jen porovnávat a volat
UNIX je systém jednoduchý, jen musíte být geniální, aby jste tu jednoduchost pochopili. Jedině OSS, vše co napíšu je pod GNU/GPL
Linux je mé koření života. Nikdy nevím, co pokazím! Registered user #550849
Dnešní počítače mi nestačí, pracuji na vlastním
Linux je mé koření života. Nikdy nevím, co pokazím! Registered user #550849
Dnešní počítače mi nestačí, pracuji na vlastním
- CZechBoY
- Master Level 9.5
- Příspěvky: 8813
- Registrován: srpen 08
- Bydliště: Brno
- Pohlaví:
- Stav:
Offline
- Kontakt:
Re: chyba v programu
nevim jakejnwhile se ti nelibi ale vsechny jsou spravne napsane...
ja tuzadnygoto nevidim :(
ja tuzadnygoto nevidim :(
PHP, Nette, MySQL, C#, TypeScript, Python
IntelliJ Idea, Docker, Opera browser, Linux Mint
iPhone XS
Raspberry PI 3 (KODI, Raspbian)
XBox One S, PS 4, nVidia GeForce NOW
IntelliJ Idea, Docker, Opera browser, Linux Mint
iPhone XS
Raspberry PI 3 (KODI, Raspbian)
XBox One S, PS 4, nVidia GeForce NOW
Re: chyba v programu
domitea píše:Ten while tam nemá vůbec smysl, jistě má se to opakovat
Je potřeba si uvědomit, že nebyla použita smyčka while, ale smyčka do... while. syntaxe je naprosto správná. Evidentně ještě ale není funkční a autor se nevyjádřil k návrhům, které tu padly. Ale použití smyčky do...while je zcela regulérní a poslední dobou také stále víc a víc objevuji její krásy :)
Jo a goto je docela svinstvo, docela solidně znepřehledňuje kód (i když, pravda, se občas může hodit), ale pokud můžu, jeho použítí se vyvaruju. Navíc se člověk v nějakých složitějších konstrukcích může dostat někam, kam vůbec nechce, opakuje se mu část kódu, kterou nechce opakovat což pak vede k tomi, že program nefunguje, jak by člověk očekával a hledat takovou chybu je poměrně neradostná činnost.
I believe in winners and loosers and in freedom to fail
Re: chyba v programu
Pro začátek - NIKDY nepoužívej GOTO, není-li to naprosto nezbytné, tedy pokud nepotřebuješ okamžitě vyskočit z mnoha vnořených cyklů úplně ven (a i tam se to dá řešit pomocí jedné proměnné navíc, je to jen trochu pomalejší). Tohle není špagetový FORTRAN nebo BASIC ale strukturované C
A teď k věci:
chybka 1 - testuješ jen velké A, ale zadáváš malé, takže tam musíš mít }while(konec=='a' || konec=='A'); jak správně píše domitea.
chybka 2 - co chybka, to je obrovská díra! Máš jednoznakovou proměnnou konec, ale načítáš do ní funkcí scanf("%s"...) řetězec. To znamená že se ti uloží minimálně dva znaky! Tedy ten co odpálíš z klávesnice plus nula ukončující řetězec, pokud napíšeš nějaké slovo, máš ho tam celé a přepíše ti všechno co bylo v paměti za ním, Ukázka:
a výsledek s parádním bočním efektem:
13 16 7
erdfgdfg
1734763634 6776420 7
Když bude ten vložený řetězec ještě o kus delší, tak ti program skončí na neoprávněný přístup do paměti.
Funkce scanf() sice umí i parametr %c, který načítá pouze zadaný počet znaků, ale tím si práci moc neusnadníš, protože budeš muset tak jako tak dořešit co se zbylými znaky v bufferu, takže nejjednodušší (a rychlejší, protože scanf() je tak trochu louda) to asi bude s getchar():
což udělá přesně to co se od něj očekává a nic navíc:
13 16 7
erdfgdfg
13 16 7
Protože jsi do konec načetl jen jeden znak, tak ti všechny ostatní včetně \n zůstaly v bufferu, a protože už je nebudeš potřebovat, odstraní je to podmíněné while hned za getchar(). Podmíněné proto, že kdybys stisk jen Enter bez ničeho, tak by čekalo ještě na jeden další stisk... Pokud bys ale chtěl aby se v takovém případě čtení klávesnice opakovalo, musíš ho dát dalšího cyklu:
A teď k věci:
chybka 1 - testuješ jen velké A, ale zadáváš malé, takže tam musíš mít }while(konec=='a' || konec=='A'); jak správně píše domitea.
chybka 2 - co chybka, to je obrovská díra! Máš jednoznakovou proměnnou konec, ale načítáš do ní funkcí scanf("%s"...) řetězec. To znamená že se ti uloží minimálně dva znaky! Tedy ten co odpálíš z klávesnice plus nula ukončující řetězec, pokud napíšeš nějaké slovo, máš ho tam celé a přepíše ti všechno co bylo v paměti za ním, Ukázka:
Kód: Vybrat vše
a=13;b=16;c=7;
do{
printf("%d %d %d\n",a,b,c);
scanf("%s", &konec);
printf("%d %d %d\n",a,b,c);
}while(konec=='a' || konec=='A');
a výsledek s parádním bočním efektem:
13 16 7
erdfgdfg
1734763634 6776420 7
Když bude ten vložený řetězec ještě o kus delší, tak ti program skončí na neoprávněný přístup do paměti.
Funkce scanf() sice umí i parametr %c, který načítá pouze zadaný počet znaků, ale tím si práci moc neusnadníš, protože budeš muset tak jako tak dořešit co se zbylými znaky v bufferu, takže nejjednodušší (a rychlejší, protože scanf() je tak trochu louda) to asi bude s getchar():
Kód: Vybrat vše
a=13;b=16;c=7;
do{
printf("%d %d %d\n",a,b,c);
konec=getchar();
if(konec!='\n')
while(getchar()!='\n');
printf("%d %d %d\n",a,b,c);
}while(konec=='a' || konec=='A');
což udělá přesně to co se od něj očekává a nic navíc:
13 16 7
erdfgdfg
13 16 7
Protože jsi do konec načetl jen jeden znak, tak ti všechny ostatní včetně \n zůstaly v bufferu, a protože už je nebudeš potřebovat, odstraní je to podmíněné while hned za getchar(). Podmíněné proto, že kdybys stisk jen Enter bez ničeho, tak by čekalo ještě na jeden další stisk... Pokud bys ale chtěl aby se v takovém případě čtení klávesnice opakovalo, musíš ho dát dalšího cyklu:
Kód: Vybrat vše
do{
...(opakovaný kód)...
do{
konec=getchar();
}while(konec=='\n');
while(getchar()!='\n');
}while(konec=='a' || konec=='A');
"Král Lávra má dlouhé oslí uši, král je ušatec!
(pravil K. H. Borovský o cenzuře internetu)
(pravil K. H. Borovský o cenzuře internetu)
Re: chyba v programu
Řekl bych, že takovýmto problémům se docela úspěšně vyhneš, nebudeš - li používat "scanf" a "printf" a přejdeš k funkčně daleko jednodušším "cin" a "cout"
Pak nebudeš muset u tak jednoduché úlohy řešit zbytkové nulové znaky v bufferu
Pak nebudeš muset u tak jednoduché úlohy řešit zbytkové nulové znaky v bufferu
I believe in winners and loosers and in freedom to fail
Re: chyba v programu
Není cin a cout z C++? Podle toho zdrojáku bych řekl že se pokouší o čisté C, a to bych rozhodně dohromady nemíchal To by už spíš mohl použít fgets() kde může zadat maximální počet načtených znaků... Každopádně by se měl především naučit hlídat kam co cpe, zvlášť jestli přechází na C z nějaké podobné hrůzy jako VisualBasic:
Jak se střelit do nohy:
C ... Střelíš se do nohy.
C++ ... Náhodně vytvoříš tucet klonů sebe sama a všechny je střelíš do nohy. Poskytnutí lékařského ošetření není možné, dokud nezjistíš, kdo jsou bitové kopie a kdo jsou ukazatele na ně a neřekneš: „Támhleten jsem já.“
BASIC ... Střelíš se do nohy pistolkou na vodu. Na velkých systémech pokračuješ, dokud nejsi po pás ve vodě.
Pascal ... Kompilátor ti nedovolí střelit se do nohy.
http://www.jaros.in/item/jak-se-strelit ... h-jazycich
P.S. Jde o to že C není programovací jazyk ale přenositelný makroassembler, tudíž za programátora absolutně nic neudělá a ten si všechno musí ohlídat sám, až do posledního bajtu. Na oplátku má zase téměř neomezené možnosti, které mu žádný vyšší jazyk nedá.
Jak se střelit do nohy:
C ... Střelíš se do nohy.
C++ ... Náhodně vytvoříš tucet klonů sebe sama a všechny je střelíš do nohy. Poskytnutí lékařského ošetření není možné, dokud nezjistíš, kdo jsou bitové kopie a kdo jsou ukazatele na ně a neřekneš: „Támhleten jsem já.“
BASIC ... Střelíš se do nohy pistolkou na vodu. Na velkých systémech pokračuješ, dokud nejsi po pás ve vodě.
Pascal ... Kompilátor ti nedovolí střelit se do nohy.
http://www.jaros.in/item/jak-se-strelit ... h-jazycich
P.S. Jde o to že C není programovací jazyk ale přenositelný makroassembler, tudíž za programátora absolutně nic neudělá a ten si všechno musí ohlídat sám, až do posledního bajtu. Na oplátku má zase téměř neomezené možnosti, které mu žádný vyšší jazyk nedá.
"Král Lávra má dlouhé oslí uši, král je ušatec!
(pravil K. H. Borovský o cenzuře internetu)
(pravil K. H. Borovský o cenzuře internetu)
-
- Mohlo by vás zajímat
- Odpovědi
- Zobrazení
- Poslední příspěvek
-
- 5
- 2727
-
od Roman Tyčka
Zobrazit poslední příspěvek
11 pro 2023 18:40
-
-
Nejde otevřít obrázek v programu fotografie Win 10 Příloha(y)
od tuningrob » 30 led 2024 13:17 » v Windows 11, 10, 8... - 14
- 2582
-
od ITCrowd
Zobrazit poslední příspěvek
01 úno 2024 18:25
-
-
- 1
- 2278
-
od Roman Tyčka
Zobrazit poslední příspěvek
25 pro 2023 18:41
-
- 1
- 3073
-
od petr22
Zobrazit poslední příspěvek
04 zář 2023 16:09
-
- 9
- 1924
-
od Domoo27
Zobrazit poslední příspěvek
12 úno 2024 23:54
Zpět na “Programování a tvorba webu”
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 2 hosti