0

文字列から double を抽出する関数を作成しました。asfas123123afaf から 123123 または afafas12312.23131asfa から 12312.23131 のように、ポイントを小数点記号として使用します。

コードは次のとおりです。

double get_double(const char *str, char sep)
{


    char str_dbl[80]; 
    size_t i,j; 
    char minus; 
    double dbl; 

    for (minus = 1, i = j = 0; i < strlen(str); ++i) 
    { 

        if ( 
            (str[i] == '-' && minus) 
            || (str[i] >= '0' && str[i] <= '9') 
            || (str[i] == 'e' || str[i] == 'E') 
            ) 
        { 
            str_dbl[j++] = str[i]; 
            minus = 0; 
        } 
    } 
    str_dbl[j] = '\0';       

    dbl = strtod (str_dbl,NULL); 

    return dbl; 



} 

しかし今、ASCII文字からユーザー定義のコンマ区切り(char sep)を設定したいと思います(^ 10のリテラルであるEまたはeなし)。どうすれば実装できますか?

これを具体的に説明しましょう: 区切り文字は ',' なので、文字列は 123123asfsaf,adsd,as.1231 となり、123123,1231 を double として返す必要があります。最初の「,」(左から) を認識し、他のすべてを無視します。

この問題の解決策を見つけるのは本当に難しいです。setlocale について考えてみましたが、最善の解決策とは思えません。

ありがとうございました!

4

3 に答える 3

1

を実行する前に、 any,をに置き換えることができます。.strtod

何らかの理由でソース文字列を変更したくない場合は、最初に新しい文字列にコピーします。

于 2012-12-04T11:27:40.030 に答える
0

usingString.Splitがこのようなことを行うことは知っていますが、最初の関数が見つかったときに停止する独自の関数を作成する必要があると思います。

その詳細については、msdn Web サイトを参照してください。

MSDN 分割

于 2012-12-04T10:59:09.960 に答える
0

コードを簡単に拡張できます。

if ( 
            (str[i] == '-' && minus) 
            || (str[i] >= '0' && str[i] <= '9') 
            || (str[i] == 'e' || str[i] == 'E') 
            ) 

char separator = ','; //or whatever you want
int have_separator = 0;

if ( 
            (str[i] == '-' && minus) 
            || (str[i] >= '0' && str[i] <= '9') 
            || (str[i] == 'e' || str[i] == 'E') 
            || str[i] == separator
            ) 
{ 
  if (str[i] == separator && have_separator == 0)
  {
    have_separator = 1;
    str_dbl[j++] = str[i];
    continue;
  }
...

これはアイデアを示すためのほんの一部であり、実際に動作するコードではないことに注意してください (ただし、とにかく動作する可能性があります)。同様の概念を使用できます。

于 2012-12-04T11:05:38.813 に答える