※「セキュリティ保護のため...」というメッセージが出る方・日本語が入力できない方へ
数字取り出し
なぜこんなルーチンを作らねばならないのか。atolで済むではないか、と思う
だろうが、atolは処理系によっては数字以外が入ってきた時にいきなりダウン
するものがある。それは困るので自作しているのである。合わせて16進数版、
日本語数字列版も提供する。
long PickSuzi(const char* str, int from, int to); //範囲指定取出し
long PickSuziS(const char* str); //0終端文字列からの取出し
long PickSuziH(const char* str, int from, int to); //16進文字列の取出し
long PickSuziHS(const char* str); //0終端版
double PickSuziD(const char* str, int from, int to); //浮動小数点数の取出し
double PickSuziSD(const char* str); //0終端版
long PickSuziJ(const char* str, int from, int to); //日本語数字列の取出し
long PickSuziJS(const char* str); //0終端版
void PickSuziA(const char* buf, int from, int to, int cnt, long* num, ...);
//配列に格納する。0-9以外で
//切れるものとする。
void PickSuziAS(const char* buf, int cnt, long* num, ...); //0終端版
/********************************************************************
* 数字の取りだし
*******************************************************************/
long PickSuzi(const char* str, int from, int to)
{
long suzi;
int k;
int fugo;
suzi=0;
fugo=1;
for(k=from; k<=to; k++)
{
if (str[k]>='0' && str[k]<='9')
suzi = suzi * 10L + (long)(str[k] & 0x0f);
else if (str[k] == '-')
fugo=-1;
}
return(suzi*(long)fugo);
}
long PickSuziS(const char* str)
{
if (!str)
return 0;
return(PickSuzi(str,0,strlen(str)-1));
}
long PickSuziH(const char* str, int from, int to)
{
long suzi;
int k;
int fugo;
suzi=0;
fugo=1;
for(k=from; k<=to; k++)
{
if (str[k]>='0' && str[k]<='9')
suzi = suzi * 16L + (long)(str[k] & 0x0f);
else if (str[k]>='a' && str[k]<='f')
suzi = suzi * 16L + (long)(str[k]-'a'+10);
else if (str[k]>='A' && str[k]<='F')
suzi = suzi * 16L + (long)(str[k]-'A'+10);
else if (str[k] == '-')
fugo=-1;
}
return(suzi*(long)fugo);
}
long PickSuziHS(const char* str)
{
if (!str)
return 0;
return(PickSuziH(str,0,strlen(str)-1));
}
double PickSuziD(const char* str, int from, int to)
{
long suzi;
int k;
int fugo;
long keta;
suzi=0;
fugo=1;
keta=0;
for(k=from; k<=to; k++)
{
if (str[k]>='0' && str[k]<='9')
{
suzi = suzi * 10L + (long)(str[k] & 0x0f);
keta = keta * 10L;
}
else if (str[k] == '-')
fugo=-1;
else if (str[k] == '.')
keta=1;
}
return( (double)suzi * (double)fugo / (double)keta);
}
double PickSuziSD(const char* str)
{
if (!str)
return 0.0;
return(PickSuziD(str,0,strlen(str)-1));
}
long PickSuziJ(const char* str, int from, int to)
{
long suzi;
int k;
int fugo;
char c1,c2;
suzi=0;
fugo=1;
for(k=from; k<=to; k++)
{
c1 = str[k];
c2 = str[k+1];
if (c1>='0' && c1<='9')
suzi = suzi * 10L + (long)(c1 & 0x0f);
else if (c1 == '-')
fugo=-1;
else if ((-127<=c1 && c1<=-97)||(-32<=c1 && c1<=-1))
{
k++;
if (c1==-126 && (79<=c2 && c2<=88))
suzi = suzi * 10L + (long)(c2-79);
}
}
return(suzi*(long)fugo);
}
long PickSuziJS(const char* str)
{
if (!str)
return 0;
return(PickSuziJ(str,0,strlen(str)-1));
}
void PickSuziA(const char* buf, int from, int to, int cnt, long* num, ...)
{
if (cnt<=0)
return;
long kk;
int i = from;
va_list arg_marker; /* 引数リストへのポインタ型宣言 */
va_start(arg_marker, num); /* 引数リスト先頭にセット */
while(1)
{
kk=0;
loop:
if (i<=to && '0'<=buf[i] && buf[i]<='9')
{
kk = kk * 10L + (buf[i]-'0');
i++;
goto loop;
}
*num = kk;
if (--cnt==0)
break;
while (i<to && (buf[i]<'0' || '9'<buf[i]))
i++;
num=va_arg(arg_marker, long*); /* ポインタを次に移す */
}
va_end(arg_marker); /* ポインタのリセット */
}
void PickSuziAS(const char* buf, int cnt, long* num, ...)
{
if (cnt<=0)
return;
int from = 0;
int to = strlen(buf)-1;
long kk;
int i = from;
va_list arg_marker; /* 引数リストへのポインタ型宣言 */
va_start(arg_marker, num); /* 引数リスト先頭にセット */
while(1)
{
kk=0;
loop:
if (i<=to && '0'<=buf[i] && buf[i]<='9')
{
kk = kk * 10L + (buf[i]-'0');
i++;
goto loop;
}
*num = kk;
if (--cnt==0)
break;
while (i<to && (buf[i]<'0' || '9'<buf[i]))
i++;
num=va_arg(arg_marker, long*); /* ポインタを次に移す */
}
va_end(arg_marker); /* ポインタのリセット */
}