![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
A 回答 (6件)
- 最新から表示
- 回答順に表示
No.6
- 回答日時:
value = strtol( buff, &argp, 10 );
と strtol を呼び出したとすると, 帰ってきたときには argp は buff の (先頭から最初の '\0' までの) どこかの要素を指すことになるので
argp == 0
となることはない (これはポインタとしての比較). ただし
*argp == 0
となることはありえる (こっちはポインタが指している値の比較). あと strtol の返り値は long なので int の変数で受けるのはあまりよくない (使っている処理系で int と long が同じだとしても).
そして isdigit ね. isdight じゃないよ. これは引数が数字であるときに真 (0 でない値), 数字ではないときに偽 (0) を返す. なので
isdigit('s')
は (文字 's' は数字ではないので) 必ず 0.
isdigit(s)
なら s に入っている値 (を文字コードとして持つ文字) によって真偽が決まる. ASCII を使っているなら s が 48以上 57以下のとき真.
No.4
- 回答日時:
ちょっと突っ込む.
「終了位置というの」が NULL になることはありえないよ.
それに, これだと
-635402493243073xkf
が (long が 32ビットだとして) 弾けないんじゃない?
No.3
- 回答日時:
この場合、(*argp != '\0') は終端(\0)ではないという意味になります
また、 (errno != ERANGE)は、エラーの理由がint型のvalueのオーバフローではない事を意味する
その両方を満たす場合なので、値への変換に失敗していると見なす
具体的には、”12a@9”のような場合
12まで変換した結果がvalueに入る
変換は成功しているので(errno != ERANGE)が成立する
一方で"12"の次は"a"であり\0(終端)ではない
なので(*argp != '\0') も成立する
だから入力された文字列の中に数字以外の文字があると推測できる
No.2
- 回答日時:
変換終了位置というのは
n = strtol("77ABC", &e, 10);
という式があれば
e="ABC" を示すことになります。
n = strtol("77", &e, 10);
ならば e=NULL となります。
つまり
文字列をロング整数に変換して失敗した位置ということになります
この回答へのお礼
お礼日時:2021/01/06 13:53
なるほど。大変わかりやすく説明していただき、ありがとうございます。
つまるところ、77abcでは十進数でabcは表せず、出力すれば77になり変換失敗部分が書式の二つ目に格納される。77の場合では変換失敗はなしということでNULL(何も示さない)となるということですね。
本当にありがとうございました!
No.1
- 回答日時:
関数のパラーメータなので、指定しない事は出来ませんが・・・・
実務上このパラメータを使う事は先ず無いですね
第一パラメータで文字列のアドレスを渡すでしょ?
そこから変換対象の文字列を探して、その終端のアドレスを格納するポインタのアドレスです
大抵は一回だけの変換で済むので、何処で終わりになろうが気になりません
だから大抵はNULLか空っぽのポインタ変数を指定するだけ
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- オープンソース IT用語、ソースとオブジェクト、改変と翻訳と翻案の違いなど どのようにりかいすればよいのですか 1 2022/09/09 10:02
- 物理学 量子力学 球面調和関数 導出 方位角成分 微分方程式の解 2 2022/07/02 13:40
- 大学受験 参考書の勉強法について質問なのですが、参考書を一通り終わらせて、二周目を行う際、問題だけ解けば良いで 2 2023/06/30 20:19
- C言語・C++・C# 競技プログラミングに関する質問です。 3 2022/04/03 19:51
- 数学 2次方程式の「(x-3)^2=4」を解くとき、 そのまま解くことも可能ですが A=x-3と置いて、A 3 2023/01/27 18:20
- その他(コンピューター・テクノロジー) AIに関連する用語を理解したい、RNN、LMM、LSTMなど、書籍で理解したい 1 2023/07/06 22:18
- C言語・C++・C# [至急]Project Euler:#13Large sum コード、入力、出力、解説 1 2022/09/24 02:30
- C言語・C++・C# [至急] Project Euler:#16 Power digit sumコード、入力、出力、解説 3 2022/09/24 02:35
- IT・エンジニアリング マコなり社長は 何故にプログラミングスクールで600人も雇用していたのか 意味不明。 ねずみこうでは 1 2022/09/24 23:46
- 国家公務員・地方公務員 公務員試験の要項で、択一式教養の説明に、 時事、社会・人文、自然に関する一般知識を問う問題 文章理解 2 2023/06/30 23:34
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
アリーナ型議会と変換型議会の...
-
緯度・経度の値をエクセルで変...
-
エクセル関数/10進法から60進法...
-
つらそう…を丁寧に言うなら、お...
-
VB.NETで小数点以下の桁数を取...
-
意外に?以外に??どちらが正...
-
miniSD変換アダプタ
-
勝手に無変換になる
-
DMファイルをDXFかDWGに変換で...
-
COのCの酸化数はいくつですか?
-
エクセルで、小数点は、全て切...
-
cdiをisoに変換したいのですが
-
平方メートルの単位の出し方。
-
MP3を楽譜に変換するサイト、ア...
-
Google 日本語入力の調子がおか...
-
土日祝 の正しい読みは
-
漢数字を算用数字に変換したい...
-
エクセル DEC2BIN 範囲外数値の...
-
movをmp4に変換すると白飛びし...
-
NFAからDFAの変換について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
緯度・経度の値をエクセルで変...
-
エクセル関数/10進法から60進法...
-
アリーナ型議会と変換型議会の...
-
MP3を楽譜に変換するサイト、ア...
-
意外に?以外に??どちらが正...
-
つらそう…を丁寧に言うなら、お...
-
教えてgoo!で 回答数 ベストア...
-
PDFファイルのプロパティ内容削...
-
VB.NETで小数点以下の桁数を取...
-
miniSD変換アダプタ
-
Windows Media PlayerからMP3に...
-
韓国料理に詳しい方に質問。韓...
-
DMファイルをDXFかDWGに変換で...
-
名前を数字にしたい。
-
スクリーンショット:文字がぼ...
-
自宅のゲーム機主にレトロゲー...
-
勝手に無変換になる
-
インディアン語で太陽は何て言...
-
単位の リューベ って
-
エクセル DEC2BIN 範囲外数値の...
おすすめ情報
なるほど。説明ありがとうございます。
以前このサイトで以下のようなソースコードをみました。errno関数を用いて数字以外の入力の際、エラーが起こるようにするというものでしたが、このソースコードのstrtol関数では空っぽなポインタ変数がargpとして置かれてると思うのですが、if文の条件式にがよく分からないのですが、、
char buff[ 256 ];
char *argp;
int value;
// 文字列で入力
scanf( "%s", buff );
value = strtol( buff, &argp, 10 ); ←10進数で変換
// ここでチェック
if ( (errno != ERANGE) && (*argp != '\0') ){
printf( "変換不可能な文字が入力されています。\n" );
exit( 1 );
}
なるほど。他の方の説明とtrajaaさんの補足で理解できました。
strtol関数の書式の二番目の終了位置というのが0あるいはNULLの場合は数字の変換がそのまま通るのでこの条件式を通ってエラーになることはないということですね。
例題を用いてわかりやすく説明していただき、ありがとうございます。
うーん。。NULLという存在がまだ100%分かってないですね。0になることは有り得るんですよね?
組み込むプログラミングが数字一文字入力が基本なので今回は目をつむります。。
ですが、後学のためにもそのような場合でも対応できるようなソースコードはどのように書けばよいでしょうか?
strtol関数の書式でいうと2番目に当たる終了位置のことです。
isdightについて調べてみたのですが、例えば以下のように変数に入力されたものが十進数なのかを判別することもできるのですか?
int s,
scanf("%d",&s);
if(isdight('s')){
printf("十進数の数字です");
}else{
printf("十進数の数字ではない");
}
ポインタ指定の時の記号*(アスタリスク)だと思っていたのですが違うようですね。
勉強ぶそくでした。。
細かい説明までありがとうございました。