Elem, pogledaj ovo parčence koda iz GlibC-2.2.4:/sysdeps/generic/strtol.c (linije 505-508):
Code:
if (__builtin_expect (overflow, 0))
{
__set_errno (ERANGE);
Znači, ne vraća ništa, ali, naravno, podešava
errno.
Pogledaj sada izmenjene verzije popularnih i korisnih programa
proba-strtol i
proba :)
Code:
[14:37:09 brcha@tbird2000 /tmp]$ cat proba-strtol.c
#include<stdio.h>
#include<stdlib.h>
#include<errno.h>
int main(){
long l;
char *wp = "55555555555555555555555555555555555555555555555555555555555\0";
char *tw;
l = strtol(wp,&tw,10);
if(wp == tw) printf("wp == tw\n");
printf("l=%ld,wp=%p,tw=%p,tw-wp=%p,tw-wp=%d,error: %s\n",l,wp,tw,tw-wp,tw-wp,strerror(errno));
return 0;
}
[14:37:30 brcha@tbird2000 /tmp]$ gcc -o proba-strtol proba-strtol.c
[14:37:37 brcha@tbird2000 /tmp]$ ./proba-strtol
l=2147483647,wp=0x80484e0,tw=0x804851b,tw-wp=0x3b,tw-wp=59,error: Numerical result out of range
[14:37:42 brcha@tbird2000 /tmp]$ cat proba.c
#include<stdio.h>
#include<errno.h>
int main(){
int x;
int y;
y = scanf("%d",&x);
printf("x=%d,y=%d\nerror=%s\n",x,y,strerror(errno));
return 0;
}
[14:37:51 brcha@tbird2000 /tmp]$ gcc -o proba proba.c
[14:37:56 brcha@tbird2000 /tmp]$ ./proba
5555555555555555555555555555555555555555555555555555555555555555555555
x=2147483647,y=1
error=Numerical result out of range
[14:38:03 brcha@tbird2000 /tmp]$ ./proba
2
x=2,y=1
error=Success
Znači, sve radi kako valja... Samo posle
scanfa treba da proveriš da li je
errno == ERANGE.
Poz!
F
PS: Nismo li budale što to odmah nismo provalili, pošto ceo libc postavlja
errno ako nešto ne valja... logično je da u
scanfu odn u
strtol nisu napravili tako debilan propust!
PS2: Zašto kažeš „metoda“? To nekako nije u duhu C jezika... radije funkcija :) (man:scanf(3) kaže o tome „The scanf family of
functions scans input...“).
... and the aliens sent an android down to earth, to slow down mankind's development
... and they named it Bill Gates.