※「セキュリティ保護のため...」というメッセージが出る方・日本語が入力できない方へ
↑ 数字取り出し


なぜこんなルーチンを作らねばならないのか。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);  /* ポインタのリセット */

}


↑
(C)copyright ffortune.net 1995-2007 produced by ffortune and Lumi.
お問い合わせはこちらから