Na otázku od ghost0007 sem dávam vlastnú malú knižnicu na parsovanie celých a desatinných čísiel.
Je samozrejme zložená z header a source súboru a napisal som aj main source subor, aby ste videli ako sa to dá použiť v praxi.
parsing.h
Kód:
#ifndef PARSING_H_INCLUDED
#define PARSING_H_INCLUDED
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <assert.h>
/**
* Funkcia skontroluje, ci vstupny retazec obsahuje iba cislice,
* ak nie, prvý odlisny znak zapise na prvu poziciu retazca
* @param vstupny retazec (vstupno - vystupny parameter)
* @return retazec prevedeny na int ak retazec obsahuje iba cislice, inaksie 0
*/
int parse_int(char *number);
/**
* Funkcia skontroluje, ci retazec obsahuje iba jednu desatinnu botku,
* ak ich obsahuje viac, vyhodnoti to ako chybu,
* skontroluje, ci obsahuje namiesto botky ciarku, ak ano, prepise ju na botku,
* skontroluje, ci vstupny retazec obsahuje iba cislice (okrem jednej botky),
* ak nie, prvy odlisny znak zapise na prvu poziciu retazca
* @param vstupny retazec (vstupno - vystupny parameter)
* @return retazec prevedeny na double ak retazec obsahuje iba cislice,
* alebo cislice a jednu botku, inaksie 0
*/
double parse_double(char *number);
#endif // PARSING_H_INCLUDED
parsing.c
Kód:
#include "parsing.h"
//#define TESTY // pri zakomentovani budu testy odstavene
int parse_int(char *number)
{
unsigned int i;
for (i = 0; i < strlen(number); i++) {
/** ak je v retazci znak iny ako cislica, return 0 **/
if (!isdigit(number[i])) {
return 0;
}
}
return atoi(number);
}
double parse_double(char *number)
{
unsigned int i, point = 0;
for (i = 0; i < strlen(number); i++) {
/** kazdu ciarku nahradi bodkou **/
if (number[i] == ',')
number[i] = '.';
/** spocita pocet bodiek **/
if (number[i] == '.') {
point++;
/** ak je bodiek viac ako 1, return 0 **/
if (point > 1)
return 0;
}
/** ak je znak iny ako cislica alebo bodka, return 0 **/
if (!isdigit(number[i]) && number[i] != '.') {
return 0;
}
}
return atof(number);
}
#ifdef TESTY
#define TESTY
int main(void)
{
/** testy funkcie int parse_int(char *number) **/
char *cislo1, *cislo2;
cislo1 = (char*)malloc(10);
strcpy(cislo1, "123456");
assert(parse_int(cislo1) == 123456);
cislo2 = (char*)malloc(10);
strcpy(cislo2, "123,456");
assert(parse_int(cislo2) == 0);
/** testy funkcie int parse_double(char *number) **/
char *cislo3, *cislo4, *cislo5, *cislo6, *cislo7;
cislo3 = (char*)malloc(10);
strcpy(cislo3, "123.456");
assert(parse_double(cislo3) == 123.456);
cislo4 = (char*)malloc(10);
strcpy(cislo4, "123.45.6");
assert(parse_double(cislo4) == 0);
cislo5 = (char*)malloc(10);
strcpy(cislo5, "123,456");
assert(parse_double(cislo5) == 123.456);
cislo6 = (char*)malloc(10);
strcpy(cislo6, "123.4x6");
assert(parse_double(cislo6) == 0);
cislo7 = (char*)malloc(10);
strcpy(cislo7, "123456");
assert(parse_double(cislo7) == 123456);
printf("Testy presli.\n");
free(cislo1);
free(cislo2);
free(cislo3);
free(cislo4);
free(cislo5);
free(cislo6);
free(cislo7);
return 0;
}
#endif // TESTY
main.c
Kód:
#include "parsing.h"
int main(void)
{
char buffer[101];
int opakovat = 1;
/** parsovanie celeho cisla **/
while (opakovat) {
printf("Zadajte cele cislo: ");
scanf(" %s", buffer);
if (!parse_int(buffer))
printf("Nespravny format cisla!\n\n");
else {
printf("Zadali ste cele cislo %d.\n\n", parse_int(buffer));
opakovat = 0;
}
}
/** parsovanie desatinneho cisla **/
opakovat = 1;
while (opakovat) {
printf("Zadajte desatinne cislo: ");
scanf(" %s", buffer);
if (!parse_double(buffer))
printf("Nespravny format cisla!\n\n");
else {
printf("Zadali ste desatinne cislo %f.\n\n", parse_double(buffer));
opakovat = 0;
}
}
printf("Pre ukoncenie stlacte klavesu.\n");
fflush(stdin);
getchar();
return 0;
}
Do prílohy som vložil súbor parsing.exe zabalený do formátu zip pre tých, ktorí si chcú parsovanie vyskúšať.
Príloha:
parsing.zip [8.54 KiB]
313 krát
_________________
kódy píšem na platforme: linux Ubuntu 12.04 (Geany, Code::Blocks), WinXP (Code::Blocks, PsPad editor),
Skype: libcokamo, ICQ: 56312279
Ak treba, napíš mi na
libcosenior@gmail.com. To mám v mobile a stále po ruke.