W wypadku wpisania zmiennej char

0

Cześć, mam problem z ulepszeniem kodu, aby w wypadku wprowadzenia zmiennej char wyświetlił komunikat o nieprawidłowej zmiennej, próbowałem dawać kod w kolejnych pętlach z if, ale nie działało to odpowiednio

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
#include<stdlib.h>

int main()
    {
    float s=0,n,a;
    float i=0;

    while(scanf("%f",&n))
    {
        if(n!=0)
        { s=s+n;
          i++;
        }
        else{printf("%f/%f=%f",s,i,s/i);}
    }


 return 0;
    }

0

A Twoje pytanie/problem to?

0

@Althorion: Ulepszenie kodu, aby w wypadku wpisania char'a wyświetlił komunikat o błędnej zmiennej

nie wiem jak w tym kodzie dać warunek , że jeśli wprowadziłeś char

3

Technicznie rzecz biorąc, to użytkownik zawsze będzie wprowadzał ciąg charów. scanf dokonuje automatycznej konwersji (stąd to f w nazwie) wg zadanej formatki.

Możesz do tego podejść na kilka sposobów — na przykład analizować wartość zwracaną przez scanf, która będzie równa udanym konwersjom (czyli jeśli mu się nie uda „wepchnąć” do odpowiedniego typu zmiennej, to dostaniesz zero lub EOF), albo przyjąć string, a potem konwertować atoi i patrzeć, czy jego wartość jest niezerowa, a jeśli zerowa, to czy wejściowy string to 0.

Ogólnie walidacja wejścia jest w C dosyć paskudna, niestety…

3

W chwili obecnej warunek while wymusza zakończenie pętli gdy użytkownik wpisze coś, czego nie uda się wczytać jako float - więc nie możesz tego tak w pętli obsłużyć. Zamiast tego, chcesz zrobić coś takiego:

while(true) {
    if (scanf("%f", &x) != 1) {
        printf("nope!\n");
        break;
    }
    // ...
}

Edit: warto rozróżnić sytuację gdy zakończony zostanie strumień od błędnego inputu - sprawdź odpowiedź MarkaR22 poniżej.

3

@Czitels: znalazłeś chyba najgorsze możliwe odpowiedzi na SO
https://godbolt.org/z/bKe5cY

#include <stdio.h>

int main() {
    float s = 0.0;
    int c;
    while(1)
    {
        c= scanf("%f",&s);
        if (c < 0) break;
        if (c == 1) {
            printf("\nnext nuber after: %g", s);
        } else {
            clearerr(stdin);
            scanf("%*[^\n]");
            printf("\nwrong input");
        }
    }

    return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1