[解決済み] C: strtol endptr は決して NULL ではない、値が整数のみかどうかを確認できない?
2022-03-05 09:07:36
質問
さて、ここで問題です。私は、.NETと思われるデータセットを持っています。
int int int int ....
しかし、1asdas 2 の場合は "asdas" の部分をキャッチできるようにしたいのです。しかし、今のところ、1 2だけだと、endptrがNULLではないので、値が数字だけなのか、数字と文字なのか、チェックできません。以下は私のコードです。
else if(token != NULL && token2 != NULL && token3 == NULL){
//we POSSIBLY encountered row and column values for the matrix
//convert the two numbers to longs base 10 number
int row = strtol(token, &result, 10);
int col = strtol(token2, &result2, 10);
printf("Result is %s and result2 is %s\n", result, result2);
//check to see if both numbers are valid
//this will be true if there were only 2 digits on the line
if(!result && !result2){
//SUCCESSFULL parsing of row and column
printf("SUCCESSFUL PARSING\n");
}
}
ありがとうございました。
解決方法は?
先のコードですでに行が個々の番号に分割されていると仮定すると、必要なチェックは次のようになります。
errno = 0;
long row = strtol(token, &endtoken, 10);
if (*endtoken != '\0')
fprintf(stderr, "invalid number '%s' (syntax error)\n", token);
else if (endtoken == token)
fprintf(stderr, "invalid number '' (empty string)\n");
else if (errno)
fprintf(stderr, "invalid number '%s' (%s)\n", token, strerror(errno));
else
/* number is valid, proceed */;
strtol
を設定することはありません。
endtoken
を指すように設定します。
数字でない最初の文字
. その文字がNULである場合
文字列の終端
(スペルが少し違うことに注意)であれば、文字列全体が有効な数字であったことになります。
ただし
endtoken == token
を与えたことを意味します。
strtol
は空の文字列であり、おそらく有効な数字としてカウントされない。 その
errno
の範囲外の数字をキャッチするために必要な操作です。
long
.
ラインバッファを分割するのではなく、ラインバッファから直接数字を取り出すことで、コードを簡略化できるかもしれません:どの行にも正確に2つの数字があると仮定して。
char *p = linebuf;
char *endp;
errno = 0;
long row = strtol(p, &endp, 10);
if (endp == p || !isspace(p) || errno)
/* error, abandon parsing */;
p = endp;
long col = strtol(p, &endp, 10);
if (endp == p || p != '\0' || errno)
/* error, abandon parsing */;
関連
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】「Expected '(' for function-style cast or type construction」エラーの意味とは?
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
-
[解決済み] 標準C++/C++11,14,17/Cを使用してファイルが存在するかどうかを確認する最速の方法?
-
[解決済み】標準ライブラリを使ってアライメントされたメモリのみを割り当てるには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】コンストラクターでのエラー:識別子を期待されますか?
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】「corrupted size vs. prev_size」glibc エラーを理解する。
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み】変数やフィールドがvoid宣言されている