gets() nie dziala w C

0
while(1) {
	char rekord[100];
	printf("Podaj rekord w postaci imie nazwisko: \n");
	gets(rekord);
} 

orientuje się ktoś może dlaczego nigdy się nie zatrzymuje program na getsie? Google niespecjalnie pomogły...

4
  1. Przed while(1) daj: while(getchar()!='\n') {}
  2. Nie używaj gets - jest niebiezpieczny bo nie kontroluje przepełnienia lepiej: scanf("%99[^\n]s",rekord); ewentualnie: fgets(stdin,rekord,100);
1

gets wyleciał z języka od standardu C11 http://en.cppreference.com/w/c/io/gets Odtąd nie istnieje w języku C taka instrukcja jak gets

0

Inna rzecz, że mnie kod działa bez zarzutu.

gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

0

Niestety żadne z powyższych rozwiązań nie pomogły.
Faktycznie mam jeszcze scanf przed printf (ale już w while). To coś zmienia?

1

Pokaż kod lub zgłoś się do wróżbitów.

0
 
int main()
{
    FILE *plikDanych = fopen("plik_z_danymi.txt", "r+");
    if(plikDanych == NULL) {
        plikDanych = fopen("plik_z_danymi.txt", "w+");
    }

    while(1) {
        printf("\nMENU\nWpisz literke i nacisnij enter aby wykonac konkretne dzialanie\n");
        printf("d - Dodaj rekord\nu - Usun rekord\na - Aktualizuj rekord\nw - Wysietl rekordy\nz - Zakoncz dzialanie programu\n");

        char dzialanie;
        scanf("%s", &dzialanie);

        if(dzialanie == 'd') {
            plikDanych = fopen("plik_z_danymi.txt", "a");
            char rekord[100];
            printf("Podaj rekord w postaci imie nazwisko: \n");
            gets(rekord);
            fclose(plikDanych);
       }
    }
}
1
char dzialanie;
scanf("%s", &dzialanie);

To jest już błąd i nadpisanie pamięci bo masz miejsce tylko na 1 znak a wczytywanie za pomocą %s wczytuje null-terminated-string czyli wczyta to co wpisałeś a na koniec doda znak \0, co oczywiście spowoduje nadpisanie stosu.
2. Otwórz ten sam plik jeszcze z 10 razy ;]

0
int main()
  {
   FILE *plikDanych;
   /* jest to sprytny pomysł ale niczego nie gwarantujący, tam niżej plik może nadal nie istnieć, poza tym zapomniałeś o zamknięciu
   plikDanych=fopen("plik_z_danymi.txt", "r+");
   if(!plikDanych) plikDanych=fopen("plik_z_danymi.txt", "w+");
   fclose(plikDanych);
   */
 
   while(1)
     {
      printf("MENU:\nd - Dodaj rekord\nu - Usun rekord\na - Aktualizuj rekord\nw - Wysietl rekordy\nz - Zakoncz dzialanie programu\n wybierz dzialanie: ");
      char dzialanie;
      scanf(" %c",&dzialanie); 
      if((dzialanie=='d')||(dzialanie=='D'))
        {
         plikDanych=fopen("plik_z_danymi.txt","a+"); /* a wystarczyło tu + dodać */
         char rekord[100];
         printf("Podaj rekord w postaci imie nazwisko: ");
         scanf("\n%99[^\n]s",rekord); 
         fputs(plikDanych,rekord);
         fclose(plikDanych);
        }
     }
  }
0

Dzięki Panowie za odpowiedzi i porady, ale niestety program wciąż się nie zatrzymuje na drugim scanf

0

Zatrzymuje się, czyli czeka na wprowadzenie danych? To chyba tak ma działać?

0
kaczus napisał(a):

Zatrzymuje się, czyli czeka na wprowadzenie danych? To chyba tak ma działać?

NIE zatrzymuje

0
scanf("\n%99[^\n]s",rekord);
0

To tak jak pokazałeś w swoim rozwiązaniu. Oczywiście sprawdziłem je wcześniej i nie działa niestety

0

Dziwnie Ideone też nie zgodnie z dokumentacją zadziałał, zamiana spacji na \n pomogła, kod poprawiłem.

0

Faktycznie działa! Wielkie dzięki!

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