Przerwanie wczytywania danych, gdy kolejna linijka jest pusta
Ostatnio zmodyfikowano 2013-11-09 14:12
arekadius Temat założony przez niniejszego użytkownika |
Przerwanie wczytywania danych, gdy kolejna linijka jest pusta » 2013-11-08 20:31:49 Yo! Program ma za zadanie odczytywać wprowadzane przez użytkownika sekwencje danych złożone z nazwiska i imienia. Maksymalna liczba podanych linii tekstu to 40, natomiast może być ich mniej - wprowadzanie powinno zostać przerwane po podaniu pustego wiersza (tylko znak końca linii). Wejście wygląda nastepująco. [nazwisko1] [imie1]'\n' [nazwisko2] [imie2]'\n' [nazwisko3] [imie3]'\n' '\n' Ciach, koniec wczytywania. Mój kod: #include <stdio.h> #include <stdlib.h> int main() { struct NPC { char nazwisko[ 40 ]; char imie[ 40 ]; }; struct NPC osoba[ 40 ]; int licznik = 0; for( int i = 0; i < 40; i++ ) { if( getchar() == '\n' ) if( getchar() == '\n' ) break; scanf( "%s %s", & osoby[ i ].nazwisko, & osoby[ i ].imie ); licznik++; } puts( "\nPodane dane to:\n" ); for( int j = 0; j < licznik; j++ ) { printf( "%d. %s %s\n", j + 1, osoby[ j ].nazwisko, osoby[ j ].imie ); } return 0; }
Oczywiście getchar zjada pierwszą literkę nazwiska. Próbowałem ją odzyskać na różne sposoby, ale ostatecznie nic nie wypaliło. Muszę również zapytać czy poprawnie używam struktur, zaś jeżeli nie, co winienem poprawić. Z góry dziękuję za wszelką pomoc! |
|
den93 |
» 2013-11-09 04:49:44 Popróbuj może z int ungetc( int _Ch, FILE * _File ); albo wczytuj całe linie do bufora i napisz algorytm który wydobędzie potrzebne Ci informacje z niego. |
|
unimator |
» 2013-11-09 14:05:05 Za pomocą scanf'a tego chyba nie zrobisz (ze strumieniami będzie podobnie). Możesz popróbować z funkcją getc_unlocked(stdin) lub getline(string). Natomiast jeśli czytasz z pliku to wystarczy sprawdzanie EOF (End of File). W konsoli generujesz ten znak za pomocą ctrl+z. #include <iostream> #include <cstdio>
using namespace std;
int main() { char buf[ 8 ]; buf[ 0 ] = '\0'; while( cin >> buf ) { printf( "ASCII code == %u\n", buf[ 0 ] ); cin.ignore(); } return 0; }
|
|
pekfos |
» 2013-11-09 14:12:49 Oczywiście getchar zjada pierwszą literkę nazwiska. Próbowałem ją odzyskać na różne sposoby, ale ostatecznie nic nie wypaliło. |
if(( c1 = getchar() ) == '\n' ) if(( c2 = getchar() ) == '\n' ) break; |
|
« 1 » |