2011-06-22 16 views
0

チェックする必要があります指定された文字列の定数値(int/long/double)はありますか?cで指定された文字列で定数値を見つける

ここで、strtol関数は定数値を見つけるために使用されます。しかし、問題に直面し

例:

if(li1 = strtol (str,NULL,0)) 
     printf("valid Integer ..."); 
  1. str = "1"出力= 1.00
  2. str = "0.99999"出力= 0.00
  3. str = "tab"出力=

0.00次に "0.99999" を区別する方法と出力を見て "タブ"?

+0

なぜ浮動小数点を扱うのであれば、 'strtof'または' strtod'を使わないのですか? –

答えて

3

整数の場合、strtolは、最初の変換不可能な文字を指すように設定される2番目の引数を提供します。

ヌルターミネータ\0以外のものなら、番号の末尾にゴミがあります。元の文字列と等しい場合は、にはの文字が見つかりました。

例:浮動小数点の場合

char *str = "72"; 

char *estr; 
float val = strtol (str, &estr, 10); 
if (estr == str) { 
    // there was no convertible characters. 
} 
if (*estr != '\0') { 
    // there was rubbish at the end. 
} 
if (errno != 0) { 
    // underflow/overflow. 
} 

、あなたはstrtoX機能のいずれかを使用する必要があります。

これは、strtol関数と非常によく似た動作をします。

使用例:

char *str = "0.9999"; 

char *estr; 
float val = strtof (str, &estr); 
if (estr == str) { 
    // there was no convertible characters. 
} 
if (*estr != '\0') { 
    // there was rubbish at the end. 
} 
if (errno != 0) { 
    // underflow/overflow. 
} 

表される文字列を入力するかを動作する機能を以下に完全なプログラムに示されている:myprog 12345 hello 12.7 1e2 0.4 .1 "" 0で実行すると

#include <stdio.h> 
#include <stdlib.h> 
#include <inttypes.h> 

#define TYP_INTEGRAL 0 
#define TYP_FLOATING 1 
#define TYP_BAD  2 
int getTypeAndData (char *str, long *valL, float *valF) { 
    char *end; 

    *valL = strtol (str, &end, 10); 
    if ((end != str) && (*end == '\0')) 
     return TYP_INTEGRAL; 

    *valF = strtof (str, &end); 
    if ((end != str) && (*end == '\0')) 
     return TYP_FLOATING; 

    return TYP_BAD; 
} 

int main (int argc, char *argv[]) { 
    char *desc[] = {"INT", "FLT", "BAD"}; 
    int i, typ; 
    long lvar; 
    float fvar; 
    for (i = 1; i < argc; i++) { 
     lvar = 0; fvar = 0; 
     typ = getTypeAndData (argv[i], &lvar, &fvar); 
     printf ("%s: [%-10s] %10ld %10.3f\n", desc[typ], argv[i], lvar, fvar); 
    } 
    return 0; 
} 

、出力されます:

INT: [12345  ]  12345  0.000 
BAD: [hello  ]   0  0.000 
FLT: [12.7  ]   12  12.700 
FLT: [1e2  ]   1 100.000 
FLT: [0.4  ]   0  0.400 
FLT: [.1  ]   0  0.100 
BAD: [   ]   0  0.000 
INT: [0   ]   0  0.000 

があります。少なくとも、私がすぐに思いつく単体テストケースは検出されています。

これは、アンダーフローとオーバーフローの状態を直接伝えないことに注意してください。これらのケースではデフォルト値が返されますが、通常はそれが合理的なオプションですが、復帰後にerrnoをチェックすることで、その条件を捕捉したい場合があります。

+0

偉大な投稿と "wetware"という言葉のために+2を1つ増やしたいと思っています。 –

+0

最初の2つでは、特定の値に対して 'errno'をチェックする必要があるかもしれません(呼び出し元がエラーを処理して手動でリセットする必要があったとしますが)? –

+0

ありがとうあなたの返事のために。しかし、それに続くテストケースでは動作しません 1. 10L ===>浮動小数点定数 2。10xyz ===>定数ではない – ashwini

関連する問題