41

関数atoistrtolまたは同様の関数)を使用する場合、整数変換が失敗したかどうか、または変換されていたC文字列がであったかどうかをどのように判断できます0か?

私がやっていること0は、許容可能な値であり、変換されるC文字列には任意の数の0sが含まれる可能性があります。また、先頭に空白がある場合もあります。

4

6 に答える 6

48

適切な関数 (C スタイルの関数を使用することを主張している限り) は次のとおりでstrtolあり、変換コードは次のようになります。

const char *number = "10"; /* for example */

char *end;
long value = strtol(number, &end, 10); 
if (end == number || *end != '\0' || errno == ERANGE)
  /* ERROR, abort */;

/* Success */
/* Add whatever range checks you want to have on the value of `value` */

いくつかのコメント:

strtol実際の数値の前の空白を許可します (意味: 静かにスキップします)。このような先頭の空白をエラーとして扱う場合は、自分で確認する必要があります。

のチェックは*end != '\0'、数字の後に何もないことを確認します。実際の数字の後に他の文字 (空白?) を許可したい場合は、それに応じてこのチェックを変更する必要があります。

PSend == number後でチェックを追加して、空の入力シーケンスをキャッチしました。「すべての空白」および「数字がまったくない」入力は、*end != '\0'チェックだけでキャッチされます。ただし、事前に空の入力をキャッチすることは理にかなっています。その場合end == numberはチェック不要となる場合があります。

于 2009-10-28T23:30:00.890 に答える
23

これはとタグ付けされているため:

template< typename T >
inline T convert(const std::string& str)
{
    std::istringstream iss(str);
    T obj;

    iss >> std::ws >> obj >> std::ws;

    if(!iss.eof())
        throw "dammit!";

    return obj; 
}
于 2009-10-28T23:21:05.637 に答える
14

C++11 以降の場合:

文字列から整数への変換のための go-to 関数は になりましstoiた。これは を受け取ってstringを返すintか、エラー時に例外をスローします。

istringstream受け入れられた回答で言及されている冗長なハックはもう必要ありません。

(それぞれ/ / / /変換用のstol/ stoll/ stof/ stod/もあります。)stoldlonglong longfloatdoublelong double

于 2015-02-14T18:47:32.927 に答える
6

strtol()のマニュアルページから:

endptrがNULLでない場合、strtol()は最初の無効な文字のアドレスを*endptrに格納します。ただし、数字がまったくない場合、strtol()はnptrの元の値を*endptrに格納します。(したがって、* nptrがそうではなく '\0'、** endptrが'\0'戻ってきた場合、文字列全体が有効でした。)

于 2009-10-28T23:13:04.687 に答える
2

C/C++ を使ってからしばらく経ちましたが、(非常に) 単純な解決策は、文字列の "0" だけをチェックすることだと思われます。

int value = atoi(string_number.c_str());

if ( !value && string_number != "0" ) {
  // error
} else {
  // great success!
}
于 2009-10-28T23:26:16.760 に答える
2

少し重いstrtolですが、の代替手段は次のとおりです。sscanf

const char *numStr = "12345";  // input string
int value;
if(sscanf(numStr, "%d", &value) == 1)
    ;  // parsing succeeded, use value
else
    ;  // error

strtol()ただし、これにより、文字列の先頭に空白を含めることができ (これは望ましい場合とそうでない場合があります)、数字の後ろに何かを置くことができるため、"123abc" が受け入れられて 123 が返されます。AndreyT が示すように。

于 2009-10-29T00:23:25.483 に答える