Więc staram się, aby program całkowicie od zera (brak biblioteki w zestawie) i mam funkcji, która jest bardzo brzydki:W prostym C, jak zrobić ekwiwalent "mapy"?
int parseUnsignedInt (char * ch, unsigned int * ui)
{
/* Starting at character ch, reads the unsigned int into the
variable ui, returns the number of characters read.
*/
ui = 0; // unsigned integer into which the string representation is read
int m = 1; // multiplier
int ncp = 0; // # of characters parsed
while (*ch)
{
bool chid = false; // ch is a decimal
for (int k = 0; k < decmapLength; ++k)
{
if (decmap[k].cval == *ch)
{
ui += decmap[k].ival * m;
m *= 10;
chid = true;
break;
}
}
if (!chid) break;
++ncp;
++ch;
}
return ncp;
}
Część jego brzydoty wynika z faktu, że muszę sposób powiązać char
acters.Prosimy do int
egers ('0' -> 0 '1' -> 1, ..., '9' -> 9), z wytworzeniem tablicę lub konstrukcjom
typedef struct icpair
{
char cval;
int ival;
} icpair;
icpair decmap [10] = {{'0',0}, {'1',1}, {'2',2}, {'3',3}, {'4',4}, {'5',5}, {'6',6}, {'7',7}, {'8',8}, {'9',9}};
int decmapLength = sizeof(decmap)/sizeof(icpair);
do tego celu. Ale szukanie wartości, jeśli nawet istnieje, uwzględnia nieestetyczną liczbę linii, które mogłyby być skondensowane, gdyby był lepszy sposób na to w czystym C. Ja też chcę, żeby to było niezawodne, więc nie odejmowanie wartości ASCII jak '9'-'ch'
. Czy jest to możliwe w czystym C, a jeśli tak, to w jaki sposób jest on realizowany?
'ui = 0;' jest błędne. – BLUEPIXY
zamień 'ui = 0' na' * ui = 0' i 'ui + = decmap [k] .ival * m' z' * ui + = decmap [k] .ival * m'. w przeciwnym razie nic nie jest zwracane – Diego
Whoops! Dzięki. –