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...
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...
while(1)
daj: while(getchar()!='\n') {}
scanf("%99[^\n]s",rekord);
ewentualnie: fgets(stdin,rekord,100);
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
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.
Niestety żadne z powyższych rozwiązań nie pomogły.
Faktycznie mam jeszcze scanf przed printf (ale już w while). To coś zmienia?
Pokaż kod lub zgłoś się do wróżbitów.
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);
}
}
}
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 ;]
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);
}
}
}
Dzięki Panowie za odpowiedzi i porady, ale niestety program wciąż się nie zatrzymuje na drugim scanf
Zatrzymuje się, czyli czeka na wprowadzenie danych? To chyba tak ma działać?
kaczus napisał(a):
Zatrzymuje się, czyli czeka na wprowadzenie danych? To chyba tak ma działać?
NIE zatrzymuje
scanf("\n%99[^\n]s",rekord);
To tak jak pokazałeś w swoim rozwiązaniu. Oczywiście sprawdziłem je wcześniej i nie działa niestety
Dziwnie Ideone też nie zgodnie z dokumentacją zadziałał, zamiana spacji na \n
pomogła, kod poprawiłem.
Faktycznie działa! Wielkie dzięki!