1

Cの( )intから解析したい。組み込みLinux用のLinuxカーネルモジュールを書いている。ここで見つけたものを使おうとしています。stringchar*simple_strtol

理想的な状況で解析しているトークンは数字になります。私が抱えている問題"0"は、有効な入力です。値を解析できなかった場合にstrtol戻ります(エラー)。0つまり、次のコードを意味します。

char* token = "should_fail";

char **endptr;
char value = simple_strtol(token, endptr, 10); // 10 is the base to convert to
if (!**endptr){
    printf("failed!");
} else {
    printf(value);
}

char* token = "0"; // should pass
char **endptr;
char value = simple_strtol(token, endptr, 10); // 10 is the base to convert to
if (!**endptr){
    printf("failed!");
} else {
    printf(value);
}

0最初のケースで失敗するはずの両方のケースで印刷されます。*endptrその引数を使用して、変換が成功したかどうかを確認しようとしていますが、機能していません。私が調査したところによると、*endptr「解析された文字列の末尾へのポインタがここに配置されます」です。そして、変換が失敗した場合、ポインターは何も指さないので、その失敗を識別できると思います。

失敗した解析を識別し、それを返さないようにしながら"0"、適切に解析しての戻り値を取得する方法を誰かが知っていますか?00

4

1 に答える 1

3

のポインタからポインタへの変数を作成しないでくださいendptr。代わりに、単一のポインターを宣言し、そのアドレスを単項演算子で渡します&

char *endptr;

simple_strtol(token, &endptr, 10);

if (endptr == NULL) ...

私はマニュアルページを読んでいませんでしたが、基本的にOPが使用したものをコピーしました。マニュアルページを整理する:

サブジェクトシーケンスが空であるか、期待される形式を持たない場合、変換は実行されません。strの値は、endptrがnullポインターでない場合、endptrが指すオブジェクトに格納されます。

これは、if strtol(または指定どおりに機能している場合は代替)が返され0 endptr == token文字列が無効であることを意味します。

したがって、チェックは

if (value == 0 && endptr == token)
{
    /* String is not a valid number */
}
于 2012-11-21T04:07:04.283 に答える