Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

C - Zakonczenie wczytywania ciagow znakow na znaku specjalnym

vigorado89 06 Sie 2013 13:56 2805 15
  • #1 06 Sie 2013 13:56
    vigorado89
    Poziom 16  

    Witam,
    otóż od paru dni nęka mnie jeden problem: mianowicie nie mogę dojść jak zrobić w programie warunek kończący wpisywanie na spacji, tak jak przy użyciu scanf wpisywanie kończę na enterze, tak chciałbym na dowolnym znaku np. spacji czy tabulacji, której funkcji najlepiej użyć? Próbowałem to stworzyć w pętli while, ale wczytywanie tekstu nigdy się nie kończy.

    0 15
  • #2 06 Sie 2013 14:51
    Rariusz
    Specjalista Automatyk

    Witam,

    Wykorzystaj funkcję get() do odczytu pojedynczych znaków.

    Pozdrawiam,

    0
  • #3 06 Sie 2013 14:59
    przemko07
    Poziom 15  

    działałoby to na zasadzie zczytaj pojedynczy znak, porównaj z z góry okreslonym zbiorem i wykonaj jakąś akcji.

    Spoiler:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    tam 2 razy incr buffsize ze względu na break który mi nie złapie tego ostatniego incr w pętli do while. Nie powinienem tak robić bo teraz to jest nie czytelne, ale głównie mi chodziło o szkielet. ten ostatni incr buffsize jest potrzebny ze względu na NULL w tablicy który jest wpisywany po zakończeniu pętli do while.

    0
  • #4 06 Sie 2013 16:50
    Krzysztof Gustaw
    Poziom 23  

    witam!
    Jeśli chcesz skończyć na np spacji, tabulacji itp skorzystaj z makra isspace(c) (w niektórych wersjach iswhite(c) np tak:

    while (!isspace(znak)) pobierz_nastepny_znak

    0
  • #5 06 Sie 2013 17:44
    krru
    Poziom 32  

    vigorado89 napisał:
    Witam,
    otóż od paru dni nęka mnie jeden problem: mianowicie nie mogę dojść jak zrobić w programie warunek kończący wpisywanie na spacji, tak jak przy użyciu scanf wpisywanie kończę na enterze, tak chciałbym na dowolnym znaku np. spacji czy tabulacji, której funkcji najlepiej użyć? Próbowałem to stworzyć w pętli while, ale wczytywanie tekstu nigdy się nie kończy.


    Nieprawda, scanf nie kończy wpisywania na enterze - to jest robota bufora konsoli. Dopóki nie wcisniesz enter ciągle możesz poprawiać wpisany tekst. Dopiero naciśnięcie entera zatwierdza i przekazuje do programu zawartość bufora. Inaczej klawisze jak np. backspace, delete czy kursory musiałyś obsługiwać sam we własnym programie.
    Są dwa wyjścia:
    Przełaczyć terminal w tryb raw
    lub użyć ncurses.

    0
  • #6 06 Sie 2013 19:39
    vigorado89
    Poziom 16  

    funkcja get() nie chce mi działać, a isspace(c) działa nieprawidlowo

    Kod: c
    Zaloguj się, aby zobaczyć kod

    a o to co skleciłem, w tej wersji program po wciśnięciu spacji dalej wprowadza znaki a po enterze wiesza się, gdy wsadzę tekst1 to program pracuje bez końca.

    0
  • #7 06 Sie 2013 20:27
    Krzysztof Gustaw
    Poziom 23  

    O, chyba się nie zrozumieliśmy...
    Nie wprowadzaj z klawiatury danych funkcją scanf, ale stwórz tablicę elementów typu char o jak największej wielkości (oczywiście w granicach zdrowego rozsądku...) jako np:

    #define MAX 2048
    char BUFOR[MAX + 3];

    po czym użyj funkcji fgets(BUFOR, MAX, stdin)
    i na koniec przeanalizuj zawartość wiersza BUFOR w sposób jaki podałem w swoim poprzednim poście. Jak już to przerobisz, użyj funkcji sscanf w odniesieniu do BUFOR żeby pójść dalej

    0
  • #8 10 Sie 2013 01:40
    blue_17
    Poziom 32  

    Kolega powyżej dał już najlepsze rozwiązanie funkcja

    isspace(int c);


    zwraca prawdę gdy :

    c jest znakiem niedrukowanym, spacją, nowa linia, znakiem końca strony, tabulacją wertykalną lub horyzontalną.

    w różnych wersjach mogą być jeszcze dodane inne znaki

    musisz dołączyć plik nagłówkowy

    ctype.h

    aby poprawnie działo :)

    Pozdrawiam

    0
  • #9 10 Sie 2013 02:07
    format_c::
    Poziom 11  

    Jeśli nie chcesz korzystać z gotowych funkcji, to możesz wykorzystać getc i tablicę ASCII

    int i;
    do{
    i = getc(...);
    ...
    }while(i != 32 && i != 28)

    0
  • #10 13 Sie 2013 18:29
    vigorado89
    Poziom 16  

    Hmmm chętnie zrobiłbym dwie wersje, z funkcjami i bez. Wersja z postu wyżej nie chce mi działać, wpisywać wpisuje ale na spacji się nie zatrzymuje.

    0
  • #11 13 Sie 2013 18:47
    format_c::
    Poziom 11  

    nawet nie wiem czy 32 lub 28 to spacja, zobacz w tabeli

    0
  • #12 13 Sie 2013 18:48
    vigorado89
    Poziom 16  

    Tak sprawdziłem 32 to spacja

    nie rozumiem czemu prosty warunek:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    nie dziala ?

    lub taki:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Zamiast scanf probowalem podmienic na getc, fgetc, getchar ale wywala jeden i ten sam blad

    0
  • #13 13 Sie 2013 19:11
    krru
    Poziom 32  

    Bo %s wczytuje string (wyraz). Ale to i tak nic nie da - będziesz musiał linijkę zatwierdzić ENTEREM.
    Dopiero w ramach tej linijki scanf będzie czytał po znaku, ale jeśli zastosujesz %c.

    0
  • #14 13 Sie 2013 19:21
    vigorado89
    Poziom 16  

    Po zamianie na %c program się nie kończy

    wstawię całość aby nie było wątpliwości:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Czy program zatrzymujący wpisywanie na spacji, tabulacji lub enterze w ten sposób jest aż tak trudne ? siedzę nad problemem miesiąc ;/

    Nawet jesli MAX zmniejsze do 10, to po wpisaniu 10 cyfer nie pojawiaja sie te cyfry jakie wprowadzilem.

    0
  • #15 13 Sie 2013 19:56
    Krzysztof Gustaw
    Poziom 23  

    Witam ponownie!
    Przecież w którymś z poprzednich postów napisałem:
    1) Stwórz sobie bufor znakowy o rozsądnej wielkości np:
    int BUFOR[1024];
    2) Kolekcjonuj w tym buforze kolejne znaki funkcją getchar() sprawdzając makrem isspace() czy aktualnie pobrany znak nie jest znakiem "białym"
    3) Po wykryciu "białego znaku" wyjdź z pętli, dopisz na końcu bufora znak '\0' i użyj funkcji sscanf, (a nie scanf) w celu pobrania właściwej wartości

    0
  • #16 13 Sie 2013 22:25
    stanleysts
    Poziom 27  

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0