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

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: 7365
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: 7365
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
  • Ukončení programu
    od fafejt » 11 pro 2023 16:52 » v Vše ostatní (sw)
    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
  • chyba 0xc0000142
    od Culter » 24 říj 2023 21:59 » v Windows 11, 10, 8...
    1
    2278
    od Roman Tyčka Zobrazit poslední příspěvek
    25 pro 2023 18:41
  • chyba na webu
    od teichmann.ondrej » 04 zář 2023 15:45 » v Programování a tvorba webu
    1
    3073
    od petr22 Zobrazit poslední příspěvek
    04 zář 2023 16:09
  • Kritická chyba Kernel Příloha(y)
    od Domoo27 » 07 úno 2024 00:58 » v Problémy s hardwarem
    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