[СИ] Как работать с off_t числами.
Язык СИ
ОС UNIX
Не знаю штатных средств работы с off_t числами, надежных.
Ниже две самодельных функции для преобразования
off_t -> строка и обратно.
Вопрос-1.
Существуют ли надежные штатные средства?
Вопрос-2.
В функции my_ato_off() (см. ниже) не знаю, как правильно
отловить выход из диапазона. Там есть закомментированная
строка, которая предположительно может отловить ошибку.
И при опробовании да, отлавливает. Но всегда ли, при
любой ли строке символов?
Кто знает прошу ответить.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
// gcc forum_off_t.c -o forum_off_t.cgi
// ./forum_off_t.cgi
//------------------- my_ato_off ---------------------
off_t
my_ato_off(const char *buf)
{
off_t s, sm;
const char *p1;
int sig=0;
p1=buf;
while(*p1==' ') p1++;
if(*p1=='-'){ sig=1; p1++;}
s=0;
while(*p1>='0' && *p1<='9'){
sm=(s*10)+((*p1)-'0');
//if(sm<s) return(-1);
s=sm;
p1++;
}
if(sig>0) s=-s;
return(s);
}
//----------------- my_off_toa -------------------------
int my_off_toa(off_t d, char *str, int Sstr)
{
char *p1, buf[30];
int k, sig=0;
p1=buf;
if(d<0) sig=1;
if(sig==0) do{ k=d%10; *p1++=('0'+k);} while((d=d/10)!=0);
else do{ k=d%10; *p1++=('0'-k);} while((d=d/10)!=0);
if((p1-buf)>=(Sstr-sig)){ *str=0; return(-1);}
if(sig>0) *str++ = '-';
while(p1>buf){ *str++ = *(--p1);}
*str=0;
return(0);
}
//--------------- main ---------------
int main()
{
char *p, buf[100], str[21];
off_t s;
int k;
printf("\n---------------------------------------\n");
while(1){
p=fgets(buf, sizeof(buf), stdin);
if(p==NULL){
printf("p==NULL\n");
printf("\n---------------------------------------\n");
continue;
}
printf("1. buf=%s\n", buf);
s=my_ato_off(buf);
printf("2. s =%lld\n", s);
k=my_off_toa(s, str, sizeof(str));
printf("3. str=%s; (%d)\n", str, k);
k=atoi(buf);
printf("4. k =%d\n", k);
printf("\n---------------------------------------\n");
}
exit(0);
}