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

program pomija funkcję getline

Object Storage Arubacloud
0 głosów
514 wizyt
pytanie zadane 16 kwietnia 2022 w C i C++ przez PoebWKlapkach Nowicjusz (120 p.)
#include <stdio.h>
#include <string.h>
#include <unistd.h>



char *buffer;
size_t buffsize = 6;
size_t choice ;


void sumowanie()
{
    double liczba1 , liczba2 , suma ; 

    scanf ("%le %le", &liczba1 , &liczba2);

    suma = liczba1 + liczba2 ;

    printf ("suma wynosi: %le\n" , suma );
}

void funkcja1()
{
    sumowanie();
    printf("  co wybierasz ?[y/n] :\n");
            
    choice = getline (&buffer , &buffsize , stdin); 

    if (strncmp(buffer , "y", 1) == 0)
    {
        printf("y \n");
    }
    else
    {
        printf("n \n");
    }
}


int main()
{
    funkcja1();

}

Dlaczego w funkcji1 program pomija getline()? Wyczytałem, że w c++ też występuje podobny problem z powodu braku czyszczenia strumienia wejścia, ale czy w c w tym przypadku jest to ten sam problem? Jak tak to jak wyczyścić strumień wejścia w c?

PS. Proszę pominąć pytania o sens tego programu został on stworzony na potrzeby tego pytania.

komentarz 17 kwietnia 2022 przez Oscar Nałogowiec (29,290 p.)
edycja 17 kwietnia 2022 przez Oscar

Scanf wczytuje cyfry a znak nowej linii pozostaje i powoduje że getline dostaje pustą linię.

Nie jest dobrym pomysłem mięszanie formatowanego wejścia (scanf) z nieformatowanym. Wejście jest traktowane jako strumień znaków, to nie są funkcję obsługujące klawiature, one obsługują strumień znaków, obojętnie skąd pochodzi. Wejście programu można przecież przekierować.

Wejście formastowane 'widzi' jakby 1 znak do przodu. Znak, który spodował zakończenie wczytywania liczby pozostaje 'nie wczytany'. Taki przykład:

$ ./test
45 67y 
suma wynosi: 1.120000e+02
 co wybierasz ?[y/n] :
y 

Podałem 1 linijkę, ENTER i program doszedł do końca. Po wczytaniu liczb znak 'y' ciągle jeszcze pozostawał w strumieniu wejściowym nie wczytany. Procedura wczytania liczby 'zobaczyła', że kolejny znak to już nie jest cyfra i zakończyła swoje czytanie.

Oczywiście jest to realizowane jako 1 znakowy bufor, nie ma zaglądania poza kolejnością do strumienia. Znak w buforze jest już fizycznie wczytany ze strumienia, ale z punktu widzenia programu jest traktowany jako niewczytany. Może tak zaglądać jedynie biblioteka io.

Dzięki temu w C istnieje funkcja ungetc - umożliwiająca takie 'cofnięcie' czytania -  ale tylko w ramach tego buforka.

komentarz 18 kwietnia 2022 przez PoebWKlapkach Nowicjusz (120 p.)
Dobra dzięki tej podpowiedzi problem został wstępnie rozwiązany w dość łopatologiczny sposób,  otóż dodałem 2 taką samą linijkę z getline (XD).Zdaje sobie sprawę, że to nie jest najlepsze rozwiązanie ale nie mam żadnego innego sensownego pomysłu aby to zrobić w miarę szybki i prosty sposób.

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

+2 głosów
1 odpowiedź 194 wizyt
pytanie zadane 12 lipca 2021 w C i C++ przez n0sk1llexe Początkujący (300 p.)
0 głosów
2 odpowiedzi 918 wizyt
0 głosów
0 odpowiedzi 265 wizyt

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...