• 締切済み

strtod

こんにちは strtodについてです。 double strtod( const char* str, char** str_end ); strtodに途中まで変換できそうで、結局変換できない文字列が渡された場合です。 例えば、 " - " といった文字列です。 この場合、規格としては*str_endになにが入ることになっているのでしょうか? こちらのページでは、 https://ja.cppreference.com/w/cpp/string/byte/strtof 「変換が行えない場合は、 ​0​ が返され、 *str_end が str に設定されます。」 という記述があります。 一方、こちらのページでは https://ja.cppreference.com/w/c/string/byte/strtof この記述はありません。 とりあえず手元にあるgcc4.6.2の場合は *str_end が str に設定されます。 あちこちページを見てみましたが、記述のあるページとないページが混在している状況で、どうにもはっきりわかりません。 昔はこんな記述はなかったと思いますので、規格のどこかの時点で記述が追加されたのではないかと思うのですが、どなたかお判りになる方はいらっしゃいますでしょうか?

みんなの回答

回答No.2

C言語とC++言語の違いでは?

titokani
質問者

お礼

>C言語とC++言語の違いでは? C89に記述があったようですので、そういうわけではなさそうです。 http://port70.net/~nsz/c/c89/c89-draft.html#4.10.1.4 規格からの伝言ゲームのどこかで欠落が発生した結果でしょうかね。

titokani
質問者

補足

ですので、規格としてはクリアになった感じですね。 なので、とりあえず問題は解決しているのですが、謎なのは、なぜこんなに多くのサイトで記述漏れがあるのかというところです。

  • maiko04
  • ベストアンサー率17% (345/1956)
回答No.1

str_endには変換できなかった文字列が返ります。 **ですのでポインターのポインターですね。 hoge なら0が返りhogeがstr_endに返ります。(**ですのでhのアドレスが返ります)

titokani
質問者

お礼

C89のころからあったようですね。 http://port70.net/~nsz/c/c89/c89-draft.html#4.10.1.4 If the subject sequence is empty or does not have the expected form, no conversion is performed; the value of nptr is stored in the object pointed to by endptr , provided that endptr is not a null pointer.

titokani
質問者

補足

それは知っています。 お手持ちの環境で” - "を変換してみてください。

関連するQ&A

  • byte[]→String変換後の文字列が違うのはなぜ?

    byte[]→String変換の処理を行っていたのですが、 使うメソッド(コンストラクタ)によって結果が違ってきます。なぜだかよくわからないのですが、どなたかご説明していただけないでしょうか。 byte[] bt; String str1 = "12345", str2; bt = str1.getBytes(); (1)str2 = new String(bt); (2)str2 = bt.toString(); (1)の方法と(2)の方法では答えが違ってきます。(1)では"12345"でしたが、(2)ではなんだか記号などまざったぐちゃぐちゃな文字列でした。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • メタキャラクタのエスケープについて

    がんばって調べているんですが、わからないので質問します。 HTMLでのメタキャラクタ(「<」「>」「&」「"」など)を エスケープしたいんですが、うまくいきません。 試した内容は、こんな感じです。 Stringクラスのreplace(char oldChar, char newChar) を使えば、上手くいくかなと思ったのですが、文字列の 長さが変わってしまう為、使えませんでした。 1文字と1文字の変換だとうまく行くのですが、今回の 場合、1文字を4文字に変換したい為、使えません^^; < → &lt; 次に考えたのが、文字列のバッファの長さを増やせる Stringbufferクラスの replace(int start, int end, String str) だと、位置を指定しなければならなくて、どうやったら 良いのかわかりません。 みなさん、どのようにしているのでしょうか? 考え方、サンプルなどありましたら、アドバイスお願いします。

    • ベストアンサー
    • Java
  • 16進数の数値を変数に代入したい

    いつもお世話になっております。 文字コードを復号して文字列を出力したいのですが 以下のdecode_charクラスのコードの13行目でエラーになります。 解決方法ご存知でしたら、ご回答いただけないでしょうか よろしくお願いします。 例)文字列"82a0"を入力値する。 0x82を16進数の数値として変換したいが NumberFormatExceptionが発生。 ------------------------------------------------ class decode_char { public static void main(String arg[]) { String str_code = arg[0]; //入力値 String divice_code = ""; //入力値の2桁ずつの文字コード byte code_ary[] = null; //divice_codeの16進数整数 String maked_char = ""; //Shift_JISで復号した文字列 for(int i = 0 ; i < str_code.length() / 2 ; i++) { divice_code = str_code.substring(i * 2,i * 2 + 2); code_ary[i] = Integer.parseInt("0x" + divice_code); } try { maked_char = new String(code_ary,"Shift_JIS"); System.out.println(maked_char); } catch(Exception e) { System.err.println("error!"); } } }

    • ベストアンサー
    • Java
  • 型変換方法について

    困っています。。 下記コードは文字コードのチェックをしているのですが、チェックする文字コードを直接指定するのではなく、 String code = "0x2460" のように持たせておきたいのですが、この文字列を使ってチェックするにはどうしたらよいでしょうか? char型に変換しないといけないと思うのですが変換方法が分かりません。 API等いろいろ調べてみたのですが分かりませんでした。 どうか宜しくお願いします。 コード---------------------------------------- public class CodeCheck {  public static void main(String[] args) {   String str = "a"; // チェック対象文字   char ch = str.charAt(0);   if(ch == 0x2460) {    // エラー処理   } else {    // 正常処理   }  } } ---------------------------------------------

    • ベストアンサー
    • Java
  • [再質問]VC#で2進数の文字列をバイト列に変換する方法

    No.1029439で質問して回答頂きましたが、もう一度お願いします。 string strに2進数の文字列がNバイト分入っているとします(0か1が8×N個入っている)。これを1バイト分ずつbyte型の配列に入れたいです。 例えば、str = "1010111100101100"と2バイト分入ってるときは、byte型の配列bytesに bytes[0] =0xAF(10101111) bytes[1] =0x2C(00101100) となるようにしたいです。 最終的には↓のようにして、文字を出力したいためです。 Encoding sjisEnc = Encoding.GetEncoding("Shift_JIS"); string str = sjisEnc.GetString(bytes); http://www.atmarkit.co.jp/fdotnet/dotnettips/011byte2str/byte2str.html よろしくお願いします。

  • [VB.net] StringからByte配列への変換

    皆さんこんばんは。 最近VB.NET2000でVisual Basicをはじめたのですが、どうにもString型の値をByte配列へ変換するやり方が分かりません。 VB6.0だとByte配列にStringを代入するだけでいいそうなのですが、.NETで代入しようとすると『型"String"の値を"Byteの1次元配列"に変換できません』というビルドエラーが表れてしまいます。 CByte( Mid(str,i,1) ) CLng( Mid(str,i,1) ) 他にも上記コードのように一つずつ変換しようと試みたのですが、String中のある文字がワイドバイトらしく、System.InvalidCastExceptionが表れてしまいます。 ("『"を上下反転したような文字) ワイドバイトのStringを1バイトずつ区切ってByte配列やLong配列へ格納する手法というものはありませんでしょうか。 よろしくお願いします。

  • ソフトウェアキーボード使ってテキストボックスの文字列末尾に文字列追加

    VB.NET WindowsMobile5.0にて開発してます。 A~Z、0~9までのソフトウェアキーボードをボタンコントロールで配置して作成してます。(WindowsMobileのPADではない) テキストボックスに各ボタンクリックイベント(A~Z、0~9)毎に文字列を連結させながら表示させたいのですが 文字列の末尾に文字を追加したい場合どうすれば良いでしょうか? 各画面にソフトウェアキーボードがあるので ファンクションを使ってクリックがある度に末尾に文字を追加していきたいので下記の様に書きクリックイベントで呼ぼうとしましたが駄目でした。 Public Function TextInsert(ByVal TI As Char) Dim str1 As String Dim str2 As String str2 = str1 '前回文字列保存 str1 = TI  '今回文字列格納 str1 = str1 & str2 '文字列連結 Return str1    '結果を戻す End Function なにかもっと簡単で良い方法ありませんか? ものすごく初歩的なことで申し訳ありませんがご教授お願いします。

  • C++型変換

    型変換が難しいです。 デバッグやフォームへ文字を表示するのに型変換で躓いています。 charからstringとやBYTEからstringなど相互変換の需要はあまりないのでしょうか? char2stirngとか一式どこかにないですか? そもそもMicrosoftがこう言った型変換を簡単にするのを提供しないのはなぜでしょう? VBはあまり意識せずできていたので、VBからするとメッセージボックスに文字や数字を出すだけでも一苦労です。

  • ArrayIndexOutOfBoundsExceptionの対処法

    jspで下記のようにStringの文字列をsplitによって Stringの配列に格納しています。 文字列strは"文字,文字" か "文字," か ",文字" という感じで格納されています。 String str; String[] str.split(","); そしてjspでString[0]とString[1]を必ず表示するようになってます。 そうすると文字列"文字,"の場合はString[1]は存在しないため 例外がでて怒られてしまいます。 文字列は入力値のため、どの文字列のパターンが来るか分からない ためどうすればいいのか分からず困っています。 いい方法があればあれば教えていただければと思います。

    • ベストアンサー
    • Java
  • String型からChar配列への変換は可能?

    String型から例えばcharの配列に変換するという事はできるでしょうか String str="OKwave"だとすると char c[]={'O','K','w','a'.'v','e'}; というような感じにしたいのですが、流石に不可能でしょうか。 もし出来ないなら、代替方法とか教えていただけるとありがたいです。 とりあえず、文字を一つ一つに分けたいのです・・・ Javaはまだ初心者で、質問内容も初歩的なものだと思いますが、よろしくおねがいします。

    • ベストアンサー
    • Java