chyba v programu

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

jirka.jirka.
nováček
Příspěvky: 1
Registrován: listopad 10
Pohlaví: Muž
Stav:
Offline

chyba v programu

Příspěvekod jirka.jirka. » 20 lis 2010 22:43

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]

Reklama
Uživatelský avatar
Suril
Level 3
Level 3
Příspěvky: 406
Registrován: únor 09
Pohlaví: Muž
Stav:
Offline

Re: chyba v programu

Příspěvekod Suril » 26 lis 2010 15:24

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');
I believe in winners and loosers and in freedom to fail

Uživatelský avatar
domitea
Tvůrce článků
Level 4.5
Level 4.5
Příspěvky: 1971
Registrován: červen 09
Bydliště: Královehradecký kraj
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: chyba v programu

Příspěvekod domitea » 27 lis 2010 22:00

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š

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í :D . Nebo to celé dát do funkce a poté jen porovnávat a volat :smile:

Uživatelský avatar
CZechBoY
Master Level 9.5
Master Level 9.5
Příspěvky: 8813
Registrován: srpen 08
Bydliště: Brno
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: chyba v programu

Příspěvekod CZechBoY » 28 lis 2010 02:40

nevim jakejnwhile se ti nelibi ale vsechny jsou spravne napsane...
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

Uživatelský avatar
Suril
Level 3
Level 3
Příspěvky: 406
Registrován: únor 09
Pohlaví: Muž
Stav:
Offline

Re: chyba v programu

Příspěvekod Suril » 29 lis 2010 18:08

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

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: chyba v programu

Příspěvekod faraon » 23 pro 2010 10:18

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:

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)

Uživatelský avatar
Suril
Level 3
Level 3
Příspěvky: 406
Registrován: únor 09
Pohlaví: Muž
Stav:
Offline

Re: chyba v programu

Příspěvekod Suril » 25 pro 2010 22:58

Ř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
I believe in winners and loosers and in freedom to fail

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: chyba v programu

Příspěvekod faraon » 26 pro 2010 12:21

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 :lol:

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)


  • Mohlo by vás zajímat
    Odpovědi
    Zobrazení
    Poslední příspěvek
  • Panely otevřených programů na hlavním panelu Příloha(y)
    od Prorock » 20 říj 2024 15:00 » v Windows 11, 10, 8...
    28
    7893
    od Prorock Zobrazit poslední příspěvek
    02 lis 2024 13:41
  • Chyba CPU na desce
    od petan320 » 24 bře 2025 15:29 » v Problémy s hardwarem
    16
    7658
    od petr22 Zobrazit poslední příspěvek
    02 dub 2025 21:50
  • Chyba hardware. Příloha(y)
    od Steage7717 » 10 lis 2024 16:29 » v Problémy s hardwarem
    4
    3266
    od Steage7717 Zobrazit poslední příspěvek
    12 lis 2024 18:49
  • Chyba příkazový řádek Příloha(y)
    od zik9 » 05 čer 2025 11:24 » v Windows 11, 10, 8...
    4
    1142
    od zik9 Zobrazit poslední příspěvek
    12 čer 2025 15:33
  • Sqlite - systémová chyba Příloha(y)
    od cindy the skull » 27 úno 2025 11:59 » v Vše ostatní (sw)
    6
    10179
    od atari Zobrazit poslední příspěvek
    16 bře 2025 11:11

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 1 host