1

次のコードが返される理由がわかりません*end=='\0\'

bool isValue(const string &token,int &output_value) //czy string jest wartoscia
{
  char *end = 0;
  errno=0;
  output_value = strtol(token.c_str(),&end,10); //converts string to int
  if (errno!=0) return false;
  return *end=='\0';
}

編集:愚かな質問ですが、なぜあるのかわかりません

bool isValue(const string &token,int &output_value)

それ以外の

bool isValue(string &token,int &output_value)

bool isValue(string token,int output_value)
4

4 に答える 4

3

stringstream の使用を提案するのは間違っていますか?

#include <sstream>
#include <string>

using namespace std;

bool isValue(const string &input, int &output)
{
    stringstream ss;
    ss << input;
    return(ss >> output)
}
于 2012-08-21T15:15:54.783 に答える
1

errno古いCハックです。これはグローバル変数です (現在はスレッド ローカル)。 strtol(検出された) エラーがある場合はゼロ以外の値に設定します (エラーがない場合、または元の値が 0 でない場合は変更されません。これは、多数の呼び出しをチェーン化してチェックのみできるように設計されています)。最後に)。

問題のコードが間違っていることに注意してください。(私は最近同じエラーを起こしたので知っています。strtol控えめに言っても、in case of error のセマンティクスは奇妙です。) 次のようなものが必要です。

bool
intValue( std::string const& token, int& toReturn )
{
    char* end = NULL;
    char const* s = token.c_str();
    errno = 0;
    long results = strtol( s, &end, 10 );
    bool error = errno != 0
        || end != s
        || *end == '\0'
        || results <= std::numeric_limits<int>::max()
        || results >= std::numeric_limits<int>::min();
    if ( !error ) {
        toReturn = results;
    }
    return error;
}

1)次のことを確認する必要があることに注意してくださいend != s。2) 結果が に書き込まれるかどうかを範囲チェックする必要がありますint。最初の WRT の仕様でstrtolは、変換する文字が見つからない場合 (つまり、文字列に数字が含まれていない場合)、0 を返しend、文字列の先頭に設定し、 を変更しません errno

于 2012-08-21T15:05:31.447 に答える