Witam programuje na Ubuntu. Musze napisać implementacje funkcji strtol. Mam juz cały kod jednak jest problem w jednym miejscu.
#include <limits.h>
#include <errno.h>
#include <ctype.h>
long int strtol (const char *nptr, char **endptr, int base)
{
int digit;
int i=0;
int znak = 0;
long int number = 0;
while (isspace(nptr[i])) i++; //jesli sa biale znaki to je pomija
//sprawdza jaki jest znak plus albo minus
if (nptr[i]=='-')
{
znak=1;
i++;
}
if (nptr[i]=='+')
{
i++;
}
//okresla podstawe(baze)
if (base == 0)
{
base =10; //podstawa dziesietna
if (nptr[i]=='0')
{
base=8; //podstawa osemkowa
if (nptr[i+1]=='x' || nptr[i+1]=='X')
{
base=16; //podstawa szesnastkowa
i++;
}
i++;
}
}
if(base <2 || base >36)
{
errno = EINVAL;
return 0;
}
while (nptr[i]!='\0')
{
digit =-1;
if (isdigit(nptr[i])!=0) //sprawdza czy dany znak jest liczba dziesietna
{
digit = (int)nptr[i]-48; //zamiana na kod ASCII a potem -48 aby od zera zaczasc
}
else if (isalpha (nptr[i])!=0) //sprawdza czy dany znak jest litera czy nie
{
digit = (int) toupper(nptr[i])-55; //zamiana z malej litery na duza a potem na kod ASCII -55 aby zaczasc od 10
}
if (digit >base || digit == -1)
{
*endptr = nptr[i];
return number;
}
if (znak == 0)
{
if (number <= ((LONG_MAX-digit)/base))
{
number=number*base + digit;
}
else
{
errno = ERANGE;
endptr= '\0';
return LONG_MAX;
}
}
if ( znak==1)
{
if (number >= ((LONG_MIN+digit)/base))
{
number=number*base - digit;
}
else
{
errno = ERANGE;
endptr= '\0';
return LONG_MIN;
}
}
i++;
}
endptr= '\0';
return number;
}
Wywala cos takiego:
boss@boss-laptop:~/strol$ gcc -o testlib testlib.c
testlib.c: W funkcjistrtol,: testlib.c:57: ostrzeżenie: przypisanie robi wskaźnik z liczby całkowitej bez rzutowania /usr/lib/gcc/i486-linux-gnu/4.2.3/../../../../lib/crt1.o: In function
_start':
(.text+0x18): undefined reference to `main'
collect2: ld returned 1 exit status
Problem jest tutaj:
if (digit >base || digit == -1)
{
*endptr = nptr[i];
return number;
}
Dziękuje za wszelką pomoc.
//wybacz... musiałem ten kod skondensować, 55% pustych linii w kodzie to przegięcie - R