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

program pomija funkcję getline

VPS Starter Arubacloud
0 głosów
653 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,300 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ź 206 wizyt
pytanie zadane 12 lipca 2021 w C i C++ przez n0sk1llexe Początkujący (300 p.)
0 głosów
2 odpowiedzi 1,074 wizyt
0 głosów
0 odpowiedzi 280 wizyt

92,970 zapytań

141,934 odpowiedzi

321,168 komentarzy

62,299 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!

...