Wyłapywanie błędów konwersji - Język C

0

Witam serdecznie,

napisałem program w języku C który pobiera zmienne jako argumenty wywołania programu. Argumenty te konwertują się na typ double. Chciałbym aby program kończył działanie w przypadku nieprawidłowej konwersji jeśli wpiszę mu np jakieś litery. Jak to zrobić?

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

int main(int argc, char* argv[])
{
    if (argc != 4)
    {
        printf("Za mało lub za dużo argumentów.\nProszę podać 3 argumenty.\n\n");
        return 1;
    }
    printf("Ilosc argumentów programu = %d\n", argc);
    double a, b, c;

    a = atof(argv[1]);

    b = atof(argv[2]);

    c = atof(argv[3]);

    printf("a=%lf b=%lf c=%lf \n", a, b, c);
    if (a == 0)
    {
        printf("To nie jest funkcja kwadratowa.\n");
        return 0;
    }
    double delta = b * b - 4 * a * c;
    printf("delta=%lf\n", delta);
    if (delta < 0.0)
    {
        printf("Brak rozwiazania.\n");
        return 0;
    }
    else if (delta == 0.0)
    {
        printf("Jedno rozwiazanie: %lf\n", -b / (2 * a));
        return 0;
    }
    else
    {
        printf("Dwa rozwiazania: %lf oraz %lf\n", (((-b) - sqrt(delta)) / (2 * a)),
            (((-b) + sqrt(delta)) / (2 * a)));
    }

    return 0;
}
1

Użyć strtod zamiast atof.

0

Nie wiem czy dobrze to zastosowałem.Zmieniłem atof na strtod. Jeśli konwersja się nie powiedzie to funkcja zwraca zero tak? Jeśli tak jest to co zrobić by po wprowadzeniu 0 do zmiennej program jednak wykonał całe działanie.

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

int main(int argc, char *argv[])
{
if(argc != 4)
{
printf("Za mało lub za dużo argumentów.\nProszę podać 3 argumenty.\n\n");
return 1;
}
printf("Ilosc argumentów programu = %d\n", argc);
double a,b,c;

a=strtod(argv[1],NULL);
if(a==0.0)
{return 1;}
b=strtod(argv[2],NULL);

c=strtod(argv[3],NULL); 
1

Przecież niepowodzenie konwersji nie przerywa działania programu. Program się kończy, jeśli (a == 0).

Chyba, że pytasz o to, jak odróżnić niepowodzenie konwersji od konwersji "0.0"?

0

Problem w stylu jak odróżnić zero od zera. Musisz sprawdzić warunkiem czy znak nie jest równy zero, jeżeli znak jest równy zero to do zmiennej wpisujesz liczbę 0, a jeśli nie to kończysz działanie programu, czyli coś takiego:

if (*argv[1] == '0') a = 0;
else return 1;

Gorzej że taki kod nie sprawdzi jednak poprawności takiego wpisu 0a albo 1a.

0

Zawsze czytać dokumentację!
http://www.cplusplus.com/reference/cstdlib/strtod/
Eksperymentowanie może pomóc zrozumieć, ale grozi też uzależnieniem się od niezdefiniowanego zachowania.
http://melpon.org/wandbox/permlink/HWmlfo69PnddhH47

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