• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Przerwanie pętli for za pomocą wpisania pustego wiersza.

VPS Starter Arubacloud
0 głosów
1,908 wizyt
pytanie zadane 14 listopada 2015 w C i C++ przez Koko$ Użytkownik (740 p.)
Witam. Mam problem z zadaniem(w języku C), a dokładniej z opuszczeniem pętli for. Zadanie mówi "wprowadzanie danych kończy pusty wiersz". Z tego co zrozumiałem chodzi o enter. Próbowałem if(getchar()=='\n') break; ale nie działa, tzn. po wciśnięciu entera kursor przesówa się o wiersz w dół a pętla się nie kończy. Ktoś ma jakiś pomysł jak rozwiązać ten problem? z góry dziękuje za odpowiedź

3 odpowiedzi

0 głosów
odpowiedź 14 listopada 2015 przez Dorion300 Szeryf (90,250 p.)
edycja 14 listopada 2015 przez Dorion300
zamiast '\n' wstaw 10.
http://wklej.org/id/1842949/
komentarz 14 listopada 2015 przez Koko$ Użytkownik (740 p.)
niestety to samo co wtedy
komentarz 14 listopada 2015 przez Dorion300 Szeryf (90,250 p.)
Mała poprawka - 10
komentarz 14 listopada 2015 przez furas Maniak (53,800 p.)
Może wstaw wypisywanie w postaci liczby znaku przechwyconego przez getchar() to sam się przekonasz co złapało.
komentarz 14 listopada 2015 przez Koko$ Użytkownik (740 p.)
if(getchar()==10) break;

jeżeli o to Ci chodzi, to nadal nie działa

 

komentarz 14 listopada 2015 przez emSon Stary wyjadacz (10,480 p.)
if(getchar() == '10') break;

Teraz?

 

komentarz 14 listopada 2015 przez Dorion300 Szeryf (90,250 p.)
edycja 14 listopada 2015 przez Dorion300
Czekaj.....

Getchar() po prostu odczytuje całą linię potem pobiera pierwszą literę!

Zmień getchar() na getch().

wtedy numer entera ma wartość 13 jak i odczytuje tylko jeden sygnał.
komentarz 14 listopada 2015 przez Koko$ Użytkownik (740 p.)
próbowałem wszystkich sposobów, dalej nic nie działa. po tym jak kazałem wypisywać mu tego getchar'a wyskakiwało tak jakby nic jakby kursor zaczynał się spacje dalej
komentarz 14 listopada 2015 przez draghan VIP (106,230 p.)


Getchar() po prostu odczytuje całą linię!

...??

komentarz 14 listopada 2015 przez Dorion300 Szeryf (90,250 p.)
Źle się wyraziłem.

 

chodzi mi o to że (przynajmniej u mnie) można wpisać cokolwiek, potem po kliknięciu enter wypisuje pierwszy znak w postaci int'a
0 głosów
odpowiedź 14 listopada 2015 przez draghan VIP (106,230 p.)

Czy to program pod Windows? Jeśli tak, zmień warunek na:

if(getchar() == '\r') break;

Związane jest to z kodowaniem znaku końca wiersza, w Windows koniec wiersza koduje się jako sekwencję "\r\n".

komentarz 14 listopada 2015 przez Koko$ Użytkownik (740 p.)
'\r' też działa tak wcześniej '\n'
komentarz 14 listopada 2015 przez draghan VIP (106,230 p.)
Pokaż kod swojego całego programu. :) Ponawiam pytanie: jaki system operacyjny?
komentarz 14 listopada 2015 przez Koko$ Użytkownik (740 p.)
win7

http://hastebin.com/hofirenoge.avrasm

kod pisany strasznie chaotycznie, możliwe że dużo rzeczy jest bez sensu
komentarz 14 listopada 2015 przez draghan VIP (106,230 p.)

Całego kodu nie przeglądałem, a skupiłem się wyłącznie na pętli, w której chcesz zastosować owo przerywanie.

Musisz zmienić sposób wczytywania tablic znaków, bo scanf() nie najlepiej sobie z tym radzi.

Możesz użyć fgets(), ale z nią masz dodatkowo obowiązek usunięcia wczytanego znaku nowej linii, jeśli go oczywiście w programie nie chcesz. ;)

Przydałyby się również komunikaty do użytkownika, co dokładnie ma wpisywać, bo w tej chwili trzeba się tego domyślać. ;)

Spójrz na ten fragment:

for(i=0; i<10; i++)//bedzie do 40 z przerwaniem wpisywania
    {

        fgets(osoby[i].imie, 30, stdin);
        // tutaj należy usunąć z wczytanej zmiennej znak końca linii, ponieważ fgets go tam umieszcza... To zrób samodzielnie. ;)
        // należy również wyczyścić bufor z ewentualnych śmieci, na Windows z MinGW można to zrobić funkcją:
        fflush(stdin);

        if(osoby[i].imie[0] == '\n' || osoby[i].imie[0] == '\r' || osoby[i].imie[0] == '\0') break;

        scanf("%s",&osoby[i].nazwisko);
        scanf("%d",&osoby[i].data_ur.rok);
        getchar();
        scanf("%d",&osoby[i].data_ur.miesiac);
        getchar();
        scanf("%d",&osoby[i].data_ur.dzien);
        osoby[i].n=osoby[i].data_ur.rok*10000+osoby[i].data_ur.miesiac*100+osoby[i].data_ur.dzien;
        x++;
    }//for

Nie potrzebujesz kolejnego getchar(), ponieważ już wczytałeś dane. Sprawdzaj tylko, czy to co wczytałeś posiada na początku znak końca linii.

Ponieważ nie do końca pamiętam szczegóły działania fgets() na Windows (jak dokładnie interpretuje znak entera), utworzyłem tak 'rozbudowany' warunek.

Powinno działać. ;)

komentarz 14 listopada 2015 przez Koko$ Użytkownik (740 p.)

Wielkie dzięki ;)

jeszcze jedno pytanko: co masz na myśli pisząc "Musisz zmienić sposób wczytywania tablic znaków, bo scanf() nie najlepiej sobie z tym radzi."?

a co do tego że trzeba się domyślać itd to wiem, to jest wersja "byle działało", później dopisze opisy, warunki żeby dane były poprawne itd.

komentarz 14 listopada 2015 przez draghan VIP (106,230 p.)

Funkcja scanf() różni się od gets sposobem stwierdzenia końca łańcucha. Funkcję scanf() można określić jako funkcję pobierającą jedno słowo W przypadku użycia specyfikatora %s łańcuch obejmuje wszystkie znaki aż do kolejnego znaku niedrukowanego(bez tego znaku) W przypadku określenia szerokości pola (%10s) scanf() kończy odczytywanie w momencie napotkania znaku niedrukowalnego lub w momencie pobrania podanej liczby znaków.

[cytat za http://www.ujk.edu.pl/informatyka/media/dydaktyka/2_C/pliki/w7_lancuchy.htm]

Czyli kompletnie się nie nadaje do wczytywania linii tekstu, czy "pustych" wierszy - po prostu je ignoruje i czeka na dostarczenie drukowanych znaków. Dlatego miałeś takie kłopoty z tym prostym zadaniem - funkcja scanf() - po wciśnięciu przez Ciebie entera - wciąż oczekiwała na podanie 'drukowanych' danych.

komentarz 14 listopada 2015 przez Koko$ Użytkownik (740 p.)
Rozumiem. Wielkie dzięki ;)
0 głosów
odpowiedź 14 listopada 2015 przez hit02 Nałogowiec (33,970 p.)
Najpierw wypisz sobie, co tak naprawdę program dostaje po wciśnięciu entera. Potem wystarczy zrobić warunek na tą wartość.
komentarz 14 listopada 2015 przez Koko$ Użytkownik (740 p.)
sprawdzałem, wypisywał mi znak biały.
komentarz 14 listopada 2015 przez Dorion300 Szeryf (90,250 p.)
pobierz znak za pomocą:

int x = getchar();

Potem wydrukuj ten x.
komentarz 14 listopada 2015 przez Koko$ Użytkownik (740 p.)
        int  y;
        y=getchar();
        printf("%d",y);
        if(y == '\r') break;

nadal to samo, przeskakuje o wiersz

komentarz 14 listopada 2015 przez Dorion300 Szeryf (90,250 p.)
A co wypisuje printf?

Jaka liczba?!
komentarz 14 listopada 2015 przez Koko$ Użytkownik (740 p.)
nic nie wypisuje właśnie

Podobne pytania

0 głosów
2 odpowiedzi 185 wizyt
pytanie zadane 22 listopada 2015 w C i C++ przez Koko$ Użytkownik (740 p.)
0 głosów
3 odpowiedzi 320 wizyt
0 głosów
2 odpowiedzi 260 wizyt

93,004 zapytań

141,969 odpowiedzi

321,248 komentarzy

62,340 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...