私は本当に混乱しています。私はかなり単純なものを見逃している必要がありますが、strtol()について読んでいるものは何も意味がありません。誰かが私のために本当に基本的な方法でそれを綴ることができますか、そして私が次のようなものを機能させる方法の例を与えることができますか?
string input = getUserInput;
int numberinput = strtol(input,?,?);
最初の引数は文字列です。これはC文字列として渡す必要があるため、最初にstd::string
使用する場合は.c_str()
。
2番目の引数はオプションでありchar *
、数値の終わりの後に文字へのポインターを保管するように指定します。これは、複数の整数を含む文字列を変換する場合に便利ですが、必要ない場合は、この引数をNULLに設定するだけです。
3番目の引数は、変換する基数(基数)です。strtol
バイナリ(基数2)から基数36まで何でも実行できます。strtol
プレフィックスに基づいて基数を自動的に選択する場合は、0を渡します。
したがって、最も簡単な使用法は次のようになります
long l = strtol(input.c_str(), NULL, 0);
10進数を取得していることがわかっている場合:
long l = strtol(input.c_str(), NULL, 10);
strtol
文字列の先頭に変換可能な文字がない場合は0を返します。成功したかどうかを確認する場合strtol
は、真ん中の引数を使用します。
const char *s = input.c_str();
char *t;
long l = strtol(s, &t, 10);
if(s == t) {
/* strtol failed */
}
C ++ 11を使用している場合は、stol
代わりに次を使用してください。
long l = stol(input);
または、を使用することもできますstringstream
。これには、次のように多くのアイテムを簡単に読み取ることができるという利点がありますcin
。
stringstream ss(input);
long l;
ss >> l;
文字列が与えられたとしますchar const * str
。次に、次のように変換します。
#include <cstdlib>
#include <cerrno>
char * e;
errno = 0;
long n = std::strtol(str, &e, 0);
最後の引数0
は、適用するベース数を決定します。0
「自動検出」を意味します。他の適切な値は、、8
または10
です16
。
次に、終了ポインタを検査する必要がありますe
。これは、消費された入力の後の文字を指します。したがって、すべての入力が消費された場合、それはヌルターミネータを指します。
if (*e != '\0') { /* error, die */ }
を使用して部分的な入力消費を許可することも可能e
ですが、それは実際に必要なときに理解できるようなものです。
最後に、エラーをチェックする必要があります。これは、基本的に、入力が宛先タイプに適合しない場合にのみオーバーフローエラーになる可能性があります。
if (errno != 0) { /* error, die */ }
C ++では、を使用することをstd::stol
お勧めしますが、この場合、基数を選択することはできません。
#include <string>
try { long n = std::stol(str); }
catch (std::invalid_argument const & e) { /* error */ }
catch (std::out_of_range const & e) { /* error */ }
C ++リファレンスからの引用:
long int strtol ( const char * str, char ** endptr, int base );
文字列を長整数に変換します
その内容を指定されたベースの整数として解釈するC文字列strを解析します。これは、longint値として返されます。endptrがnullポインターでない場合、関数はendptrの値も、数値の後の最初の文字を指すように設定します。
だから、次のようなものを試してください
long l = strtol(pointerToStartOfString, NULL, 0)
私はいつも単純に使用しますstrol(str,0,0)
-それは長い値を返します。基数(最後のパラメーター)の0は、入力文字列から自動検出することを意味します。したがって、入力文字列では0x10
16進数と10
10進数の両方を使用できます。