Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Przerwanie wczytywania danych, gdy kolejna linijka jest pusta

Ostatnio zmodyfikowano 2013-11-09 14:12
Autor Wiadomość
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:


C/C++
#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!
P-95702
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.
P-95747
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.
C/C++
#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;
}
P-95768
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.
C/C++
if(( c1 = getchar() ) == '\n' )
if(( c2 = getchar() ) == '\n' )
     break;
P-95772
« 1 »
  Strona 1 z 1