problem z uzyciem gets()

0

Witam, w mam pewien problem z moim ostatnim programie ktorego pochodzenie jest dla mnie zagadka;] Mianowicie w jednej z funkcji ("wpisz") kompilator jakby nie widzial pierwszego gets() niezaleznie od tego w ktorym miejscu bym go umiescil. Kiedy pierwszy gets() w tej funkcji znajdowal sie w petli for to przy pierwszym przebiegu funkcji tak jakby go nie bylo, a potem juz program dzialal normalnie. Kod kompilowalem na dwoch roznych kompilatorach pod roznymi systemami, problem zapewne wynika z mojej nieznajomosci skladni.

 /*Autor Tomasz Siczek 2010*/
#include <stdio.h>
#include <time.h>
#define MAXX 5
#define MAXY 5
#define INTERWAL 0.1

void czekaj(void);
void wpisz (int [MAXX][MAXY]);
void wyswietl (int [MAXX][MAXY]);
int sprawdz (int [MAXX][MAXY]);
void przejdz (int [MAXX][MAXY]);




int main(void)
{
int kroki;
int pola[MAXX][MAXY];

printf("Program sluzy do symulacji rozwoju kolonii komorek.\nProsze wpisac liczbe krokow ewolucji (liczbe naturalna\nz przedzialu <1,200>) : ");
scanf ("%d", &kroki);
while (kroki<1 || kroki>200)
{
      printf("\nWprowadzona liczby jest spoza przedzialu.\nWpisz liczbe naturalna z przedzialu <1,200> : ");
      scanf("%d", &kroki);
}
printf("Podaj stan poczatkowy kolonii. Zyje ona na planszy %dx%d.\n",MAXX,MAXY);
printf("Zaraz zostanie poproszony o wpisanie %d %d-elementowych\nciagow znakow zlozonych z 0 i 1\n",MAXX,MAXY);
printf("Kazdy ciag odpowiada polom na w jednym wersie.\nN-ty element oznacze n-te pole danego wersu\n");
printf("Znak '1' oznacza zyjace pole, '0' martwe\n");
printf("Podaj %d %d-elementowych ciagow.Mozesz wpisac dluzszy ciag niz %d-znakowy ale i tak\n",MAXX,MAXY,MAXY);
printf("bedzie brane pod uwage pierwsze %d znakow. Kazdy ciag potwierdz klikajac 'ENTER'\n",MAXY);

wpisz(pola);

int i=0;
for(i;i<kroki;i++)
{
    wyswietl(pola);
    przejdz(pola);
    czekaj();
}


printf("/nCzy zostaly zywe komorki? : ");
if (sprawdz(pola)) printf("YES");
else
printf("NO");
}

void czekaj(void)
{
time_t czas;
czas = time(0);
while(1)
          {
          if (czas<(time(0)-INTERWAL))
          break;
          }
}

void wpisz (int ekran[MAXX][MAXY])
{
int i=0;
int j=0;
int k;
char linia[100];
gets (linia);
for(i;i<MAXX;i++)
{
    gets(linia);
    for(j;j<MAXY;j++)
    {
        if (linia[j]=='1')
        ekran[i][j]=1;
        else if(linia[j]=='0')
        ekran[i][j]=0;
        else
        {
        k=1;
        while(k)
        {
            printf("\nWprowadziles\\as nieprawidlowy ciag, wprowadz od nowa\n");
            gets(linia);
            if (linia[j]=='1')
            {
            ekran[i][j]=1;
            k=0;
            }
            else if(linia[j]=='0')
            {
            ekran[i][j]=0;
            k=0;
            }
        }
        }
    }
    j=0;
}
}

void wyswietl (int ekran[MAXX][MAXY])
{
    int i=0,j=0;
    printf("\n\n\n");
    for (i;i<MAXX;i++)
    {
        for (j;j<MAXY;j++)
        printf("%d",ekran[i][j]);
        j=0;
        printf("\n");
    }
}

int sprawdz (int ekran[MAXX][MAXY])
{
 int i=0, j=0, suma=0;
 for(i;i<MAXX;i++)
 {
     for(j;j<MAXY;j++)
     {
         suma=suma+ekran[i][j];
     }
     j=0;
 }

 return (suma);
}

void przejdz (int pre[MAXX][MAXY])
{
    int i=1, j=1, suma;
    int post[MAXX][MAXY];
    /*najpierw dla wewnetrznych*/
    for (i;i<MAXX-1;i++)
    {
        for(j;j<MAXY-1;j++)
        {
        suma= pre[i-1][j-1] + pre[i-1][j] + pre[i-1][j+1] + pre[i][j-1] + pre[i][j+1] + pre[i+1][j-1] + pre[i+1][j] + pre[i+1][j+1];
        if (pre[i][j]==0 && suma==3)
        post[i][j]=1;
        else if(pre[i][j]==0 && suma!=3)
        post[i][j]=0;
        else if(pre[i][j]==1 && suma>1 && suma<4)
        post[i][j]=1;
        else
        post[i][j]=0;
        }
    j=1;
    }
    /*przejscia dla rogow*/
    /*prawy gorny rog*/
    suma=pre[0][1]+pre[1][1]+pre[1][0]+pre[0][MAXY-1]+pre[1][MAXY-1]+pre[MAXX-1][0]+pre[MAXX-1][1]+pre[MAXX-1][MAXY-1];
        if (pre[0][0]==0 && suma==3)
        post[0][0]=1;
        else if(pre[0][0]==0 && suma!=3)
        post[0][0]=0;
        else if(pre[0][0]==1 && suma>1 && suma<4)
        post[0][0]=1;
        else
        post[0][0]=0;

    /*prawy dolny rog*/
    suma=pre[MAXX-2][0]+pre[MAXX-2][1]+pre[MAXX-1][1]+pre[MAXX-1][MAXY-1]+pre[MAXX-2][MAXY-1]+pre[0][0]+pre[0][1]+pre[0][MAXY-1];
        if (pre[MAXX-1][0]==0 && suma==3)
        post[MAXX-1][0]=1;
        else if(pre[MAXX-1][0]==0 && suma!=3)
        post[MAXX-1][0]=0;
        else if(pre[MAXX-1][0]==1 && suma>1 && suma<4)
        post[MAXX-1][0]=1;
        else
        post[MAXX-1][0]=0;
    /*lewy gorny rog*/
    suma=pre[0][MAXY-2]+pre[1][MAXY-2]+pre[1][MAXY-1]+pre[0][0]+pre[1][0]+pre[MAXX-1][0]+pre[MAXX-1][MAXY-2]+pre[MAXX-1][MAXY-1];
        if (pre[0][MAXY-1]==0 && suma==3)
        post[0][MAXY-1]=1;
        else if(pre[0][MAXY-1]==0 && suma!=3)
        post[0][MAXY-1]=0;
        else if(pre[0][MAXY-1]==1 && suma>1 && suma<4)
        post[0][MAXY-1]=1;
        else
        post[0][MAXY-1]=0;

    /*lewy dolny rog*/
    suma=pre[MAXX-1][MAXY-2]+pre[MAXX-2][MAXY-2]+pre[MAXX-2][MAXY-1]+pre[0][MAXY-1]+pre[0][MAXY-2]+pre[MAXX-1][0]+pre[MAXX-2][0]+pre[0][0];
        if (pre[MAXX-1][MAXY-1]==0 && suma==3)
        post[MAXX-1][MAXY-1]=1;
        else if(pre[MAXX-1][MAXY-1]==0 && suma!=3)
        post[MAXX-1][MAXY-1]=0;
        else if(pre[MAXX-1][MAXY-1]==1 && suma>1 && suma<4)
        post[MAXX-1][MAXY-1]=1;
        else
        post[MAXX-1][MAXY-1]=0;
    /*przejscia dla scian zewnetrznych*/
    /*lewa sciana*/
    i=1;
    for (i;i<MAXX-1;i++)
    {
        suma=pre[i-1][0]+pre[i-1][1]+pre[i][1]+pre[i+1][1]+pre[i+1][0]+pre[i-1][MAXY-1]+pre[i][MAXY-1]+pre[i+1][MAXY-1];
        if (pre[i][0]==0 && suma==3)
        post[i][0]=1;
        else if(pre[i][0]==0 && suma!=3)
        post[i][0]=0;
        else if(pre[i][0]==1 && suma>1 && suma<4)
        post[i][0]=1;
        else
        post[i][0]=0;
    }
    /*gorna sciana*/
    i=1;
    for (i;i<MAXY-1;i++)
    {
        suma=pre[0][i-1]+pre[1][i-1]+pre[1][i]+pre[1][i+1]+pre[0][i+1]+pre[MAXX-1][i-1]+pre[MAXX-1][i]+pre[MAXX-1][i+1];
        if (pre[0][i]==0 && suma==3)
        post[0][i]=1;
        else if(pre[0][i]==0 && suma!=3)
        post[0][i]=0;
        else if(pre[0][i]==1 && suma>1 && suma<4)
        post[0][i]=1;
        else
        post[0][i]=0;
    }
    /*dolna sciana*/
    i=1;
    for (i;i<MAXY-1;i++)
    {
        suma=pre[MAXX-1][i-1]+pre[MAXX-2][i-1]+pre[MAXX-2][i]+pre[MAXX-2][i+1]+pre[MAXX-1][i+1]+pre[0][i-1]+pre[0][i]+pre[0][i+1];
        if (pre[MAXX-1][i]==0 && suma==3)
        post[MAXX-1][i]=1;
        else if(pre[MAXX-1][i]==0 && suma!=3)
        post[MAXX-1][i]=0;
        else if(pre[MAXX-1][i]==1 && suma>1 && suma<4)
        post[MAXX-1][i]=1;
        else
        post[MAXX-1][i]=0;
    }
    /*prawa sciana*/
    i=1;
    for (i;i<MAXX-1;i++)
    {
        suma=pre[i-1][MAXY-1]+pre[i-1][MAXY-2]+pre[i][MAXY-2]+pre[i+1][MAXY-2]+pre[i+1][MAXY-1]+pre[i-1][0]+pre[i][0]+pre[i+1][0];
        if (pre[i][MAXY-1]==0 && suma==3)
        post[i][MAXY-1]=1;
        else if(pre[i][MAXY-1]==0 && suma!=3)
        post[i][MAXY-1]=0;
        else if(pre[i][MAXY-1]==1 && suma>1 && suma<4)
        post[i][MAXY-1]=1;
        else
        post[i][MAXY-1]=0;
    }
    /*przepisanie tablicy post do pre*/
    i=0;
    j=0;
    for(i;i<MAXX;i++)
    {
        for(j;j<MAXY;j++)
        {
           pre[i][j]=post[i][j];
        }
    j=0;
    }
}
0

Widzę, że piszesz w C/89 (używanie jednej zmiennej dla licznika itp). Ja mam uczulenie na #define, ponieważ w C/99 (i w C/89 też) można spokojnie stosować const. Już czas, żeby przestać myśleć w kategoriach K&R C. ;)
Główny problem z używaniem gets() jest taki, że w ogóle go nie powinieneś używać. ;) http://www.gidnetwork.com/b-56.html
edit: Użyj po prostu fgets()

Twój problem polega jednak na czymś innym - scanf() zostawia po sobie "\n" (znak nowej linii, "Enter").

0

Kliknij, aby napisać szybką odpowiedź...Pierwsza zasada: nie używać gets

</b>. Nigdy. Przenigdy.
<code noframe>gets

jest zue.
Używaj fgets(). Tylko bierz poprawkę, że fgets

 zachowuje znak nowej linii <code noframe>\n

na końcu.

Azrael_valedhel napisał(a)

Widzę, że piszesz w C/89 (używanie jednej zmiennej dla licznika itp).
To nie jest C89, bo w main()

 jest nagle <code noframe>int i=0;

w środku. Więc jest to albo C99, C++, albo co najmniej rozszerzenie standardowego C89.

edit: rotfl, „usterki” systemu 4programmers mnie czasami rozbrajają…

edit2: przypomniało mi się, że w C1x będzie gets_s(), już istniejące jako rozszerzenie w microsoftowym Visualu.
h‌ttp://msdn.microsoft.com/en-us/library/5b5x9wc7(v=vs.80).aspx
Teraz tylko czekać, aż reszta kompilatorów to przyjmie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1