0

私はこれが繰り返される質問であることを知っており、それに対する多くの回答を見てきましたが、これまで本当に私を助けることができたものはありません.

さまざまな文字列を 2 つのメソッドに渡すことができるようにする必要があります。1 つは double を返し、もう 1 つは int を返します。主な問題は、数値を含まず数値のみを含む文字列を渡すと、メソッドが変換を行わないように、両方のメソッドで厳密なエラー チェックが必要なことです。私が言ったように、私はいくつかの解決策を見てきましたが、私が見た唯一の良い解決策 (従うことができた) は、使用したくない Boost を使用することでした。私が従うことができなかった答えについては、ここからコピーされたその一部です

C++で文字列をintに解析する方法は?

最善の解決策

幸いなことに、誰かがすでに上記の問題をすべて解決しています。C 標準ライブラリにはstrtol、これらの問題のないファミリが含まれています。

enum STR2INT_ERROR { SUCCESS, OVERFLOW, UNDERFLOW, INCONVERTIBLE };

STR2INT_ERROR str2int (int &i, char const *s, int base = 0)
{
    char *end;
    long  l;
    errno = 0;
    l = strtol(s, &end, base);
    if ((errno == ERANGE && l == LONG_MAX) || l > INT_MAX) {
        return OVERFLOW;
    }
    if ((errno == ERANGE && l == LONG_MIN) || l < INT_MIN) {
        return UNDERFLOW;
    }
    if (*s == '\0' || *end != '\0') {
        return INCONVERTIBLE;
    }
    i = l;
    return SUCCESS;
} 

誰かがそれをもう少し説明できれば、それが私が探している答えだと思います。自分のコードにアイデアを適用できるように、それが何をしているのかを十分に理解することはできません。

4

3 に答える 3

1

strtol(そしてダブルスのために)使用strtodすることは正しいアプローチのように聞こえます。引用した実装は、次のドキュメントから直接流れますstrtol

  • errno呼び出しの前にゼロに設定されます(成功strtolしても変更されません)errno
  • errnoに戻ったときにstrtol、エラーが通知されたかどうかを調べます
  • 最後の条件は、入力が空ではないこと、および入力全体がによって消費されていることを確認しますstrtol

sの実装はdouble、を使用することを除いて同じように見えますstrtod

于 2013-02-09T23:17:18.237 に答える
1

学習演習として、これを自分で書いてみることをお勧めします。いくつかの例から始めることをお勧めします。数字が書面でどのように表されているかをしっかりと把握することから始めたいと思うかもしれません。「42」とはどういう意味ですか?言い換えれば、2は何を表し、4は何を表しますか?同様に、「1000000」はどういう意味ですか?これらの概念を理解したら、文字列を整数に変換するために実行する手順(英語)を書き留めます。そこから、コードへの変換を開始します。途中で行き詰まった場合は、お気軽にご質問ください。

于 2013-02-09T23:18:45.917 に答える
0

私はこの質問を別の場所で言い換えて、最終的に私が探していた答えを得ました。ここに疑問がある場合は、リンクがあります:

strtolの基本?

于 2013-02-10T04:21:53.077 に答える