Konwersja ciągu znaków na double

0

Witam, piszę funkcje, która ma sprawdzać poprawność wprowadzanych danych(żeby zamiast liczb ktoś nie wpisał liter). "Na brudno" napisałem sobie coś takiego(może pięknie to nie wygląda, ale to taka prowizorka :) ).

 #include<stdio.h>
#include<string.h>


int main()
{
   int i,j,licz=0;
    double l;
    char zp[256];
    printf("Podaj ciag znakow: ");
    scanf("%s",zp);
    j=strlen(zp);
    for(i=0; i<j; i++)
    {
    if(zp[i]!='-' && zp[i]!='0' && zp[i]!='1' && zp[i]!='2' && zp[i]!='3' && zp[i]!='4' && zp[i]!='5' && zp[i]!='6' && zp[i]!='7' && zp[i]!='8' && zp[i]!='9'&& zp[i]!='.')
    licz++;
    }
    if(licz==0)
    {
     printf("Podales cyfry\n"); 
     l=atof(zp); 
    }
    else 
    printf("Podales litery");
    printf("%lf", l); 
	return 0;
}

Mam problem z konwersją ciągu na double. Dev c++ na win7 za każdym razem wyświetla inną liczbę np 456131.000000. W unixie wyświetla się cały czas ta sama liczba, niezależnie od podanego ciągu. Co jest źle w tym kodzie?
Może ktoś ma inny pomysł, żeby sprawdzić poprawność wprowadzanych danych?(głównie chodzi o to że jak ktoś wpisze litery do double to program się nie wysypie tylko powie żeby wpisać jeszcze raz dane).

0

coś jak kto:

while(!poprawne)
{
      poprawne = 1;
      printf("Podaj liczbe:");
      scanf("%s", zp);
      for(i = 0; i < strlen(zp); i++)
               if(!isalpha(zp[i]))
               {
                       poprawne = 0;
                       break;
               }
}
0

Isalpha nie jest za dobrym rozwiązaniem, bo to tylko reaguje na litery. W linku też nie jest to jakieś super rozwiązanie dla C. Samo sprawdzanie ciągu działa mi dobrze, tylko ta konwersja funkcją atof wywala jakieś śmieci.

0

Przede wszystkim char przechowuje kod ASCII, więc to:

if(zp[i]!='-' && zp[i]!='0' && zp[i]!='1' && zp[i]!='2' && zp[i]!='3' && zp[i]!='4' && zp[i]!='5' && zp[i]!='6' && zp[i]!='7' && zp[i]!='8' && zp[i]!='9'&& zp[i]!='.') 

Możesz zamienić na sprawdzenie czy zp[i] jest z konkretnego przedziału ASCII. Natomiast znak '-' sprawdzasz tylko w zd[0] bo po co później?.

a może isalnum()?

0

Racja - napisałem że to taka prowizorka na szybko :) Uznajmy,że ta część kodu jest nieważna. Potrzebuje zamienić ten "przefiltrowany" ciąg na liczbę double, ewentualnie float. Jak to poprawnie zrobić?

0

Trochę toporne ale możesz dać tak: double liczba = 0 i potem dodajesz do niej (indeks zależnie od tego czy jest minus) zp[0], zp[1]*0.1, zp[2]*0.01, zp[3]*0.001 i tak do końca. Nie przychodzi mi do głowy lepsze rozwiązanie póki co...

0

Znalazłem w necie, że do takiej konwersji służy funkcja atof, ale ona nie działa mi poprawnie ;/

0

Problem rozwiązany. Nie dodałem biblioteki <stdlib.h> xD Dziwne, że kompilator nic nie wywalił, że brakuje czegoś.

0

kompilujesz pewnie jako "C" - w takim wypadku deklaracje funkcji nie są obowiązkowe. Wywołując funkcję x(12.3, 12.3) kompilator zakłada, że funkcja x ma deklarację int x(double, double) ... itd itp - typ zwracany domyślnie zakłada int. A typy argumentów na podstawie tego, co przekazujesz. Do jakich błędów dziwacznych to czasem prowadzi... to już wiesz ;)

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