Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem C - Program prestal pracovat

Zdravim vas, rad by som naplnil retazec nejakymi !cislami! a budem ich davat v jednom riadku oddelene medzerami pokial nestlacim enter.... napr. 11 22 33\n akonahle stlacim Enter program ihned prestane pracovat... zozaciatku to islo a vypisalo mi to retazec ale namiesto volneho miesta to pisalo nieco ako napr. 11 22 33...Windows_NT no a po viacerych pokusoch uz ani nevypise z dovodu padu exe. Neviete kde je chyba prosim?

#include <stdio.h>
#include <stdlib.h>

int main()
{
    const int POCET=20;
    char *retazec=(char*)malloc(POCET*sizeof(char));
    char znak;
    int i=0;

    for(i=0;(znak=getc(stdin))!='\n';++i)
    {
        retazec[i]=znak;
    }
    return 0;
}
Předmět Autor Datum
getc necaka na vstup ale vracia EOF, co samozrejme netestujes a prepises si cely stack. Netestujes a…
MM.. 05.11.2014 18:49
MM..
alebo ak getc(stdin) caka na enter (neviem teraz zhlavy), tak musis testovat asi '\r' (plus limity p…
MM.. 05.11.2014 18:59
MM..
Alebo ti dosla RAM apod a malloc vracia NULL. Ani toto netestujes.
MM.. 05.11.2014 19:04
MM..
A ten tvoj program z dotazu nic nevypisuje. Ak ten string chces vypisovat (alebo akekolvek ine stri…
MM.. 05.11.2014 19:05
MM..
Ten vypis som vymazal schvalne aby to bolo prehladnejsie.... viem ze by sa mala testovat RAM aj limi…
Parker 05.11.2014 19:31
Parker
Po cykle for napises: retazec[i]='\0';
MM.. 05.11.2014 19:46
MM..
A pada ti to prave na tom vypise, takze tym ze si v dotaze vymazal samotnu pricinu/chybu, si len vse…
MM.. 05.11.2014 19:48
MM..
nie padlo to akonahle som stlacil enter aj ked som ten vypis uz vymazal
Parker 05.11.2014 20:29
Parker
Tak si to po tej zmene neskompiloval :) Alebo testuj '\r', neviem co dava ako novy riadok tvoj OS.… poslední
MM.. 05.11.2014 20:36
MM..

getc necaka na vstup ale vracia EOF, co samozrejme netestujes a prepises si cely stack. Netestujes ani limity pola, netestujes nic. Planujes robit pre MS? :)

BTW:

char *retazec=(char*)malloc(POCET*sizeof(char));

normalny clovek napise ako
char retazec[POCET];
ma to svoje vyhody.

Slusne sa to robi tak ze pole alokujes cez malloc a potom dynamicky realokujes ak nestaci. A testuje sa navratova hodnota na chybu, po kazdej (re)alokacii.

P.S. a nauc sa pouzivat debugger. Urcite ho mas aj v tvojom vyvojovom prostredi.

Ten vypis som vymazal schvalne aby to bolo prehladnejsie.... viem ze by sa mala testovat RAM aj limity retazca ale postaci mi na konkretnu ulohu toto bez kontroly jaj vidis to bude asi tym ze som tam nedal \0 a to dam normalne za tym alokovanym polom ze retazec[20]='\0'; ??

Tak si to po tej zmene neskompiloval :)

Alebo testuj '\r', neviem co dava ako novy riadok tvoj OS.
V kazdom pripade musis v cykle testovat aj i<(POCET-1), a ak to uz neni splnene tak nesmies vliezt do cyklu ale musis ho ukoncit. POCET-1 preto, aby si mal miesto na tu ukoncovaciu nulu.
Tym testom zabezpecis ze ti to nepadne (nebudes prepisovat cudziu pamat kdesi), ale normalne program dobehne aj keby tam bol nejaky problem s chybajucim '\n' apod. Mozno getc ani neposiela '\n' alebio '\r' neviem zhlavy, ale nejaky koniec riadku by mal poslat.

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