質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

428閲覧

C++でchar型の数値を数字列に変換したい

aquaS

総合スコア191

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1グッド

0クリップ

投稿2017/09/27 13:26

ログ出力のマクロを作っています。

前提条件として、

  1. パラメータに、任意の数値型と任意のポインタ型の値が渡される
  2. 数値型の数値を10進の数字列でバッファに出力
  3. ポインタ型はアドレス値を16進もしくは10進(どちらでもOK)でバッファに出力
  4. ログ出力はwritelog()関数を使う必要が有る

以下のようなコードを作成したのですが、char型の出力で問題が有ります。

C++

1#define APPLOG(value) \ 2{ \ 3 std::stringstream ss; \ 4 ss << (value); \ 5 writelog(ss.str().c_str()); \ 6} 7 8void writelog(const char* log);

intやlongなどは大丈夫なのですが、
charの数値だと文字コードとして扱われて文字として出力されてしまいます。

C++

1ss << std::dec << (value);

としても変わりませんでした。
文字では無く数字列で出力するにはどうすればいいでしょうか?
よろしくお願い致します。

環境:
gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.4)

yohhoy👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんにちは。

char型は頭痛いですね。
char型とchar const型に対してフリー関数のstd::operator<<がオーバーロードされているので、char型を文字として出力します。char constも同様なのでポインタがnullptrだと落ちます。

メンバ関数のostream::operator<<()ならば、数値として出力してくれますので、明示的に呼び出すとお手軽です。
ついでにマクロ使うなら、変数名もお手軽にログへ出せますよ。

C++

1#include <iostream> 2#include <sstream> 3 4#define APPLOG(value) \ 5{ \ 6 std::stringstream ss; \ 7 ss << #value "="; \ 8 ss.operator<<(value); \ 9 writelog(ss.str().c_str()); \ 10} 11 12void writelog(char const* iStr) 13{ 14 std::cout << iStr << std::endl; 15} 16 17int main() 18{ 19 char x=123; 20 APPLOG(x); 21 APPLOG(&x); 22}

wandbox

投稿2017/09/27 13:42

編集2017/09/27 13:43
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Chironian

2017/09/27 13:46

あ、char const*て直接書いてもちゃんと出てます。 terateilにいつの間にかフールプルーフ入ったのですね。これはありがたい。
aquaS

2017/09/27 13:48

おお!出来ました。 ありがとうございます。助かりました。
guest

0

intにキャストして出力すればいいのでは。

C++

1#include <iostream> 2int main(void) { 3 char num = 97; 4 std::cout << num << std::endl; 5 std::cout << static_cast<int>(num) << std::endl; 6 return 0; 7}

出力

a 97

適当に組んでみました。

C++

1template<typename T> 2inline void APPLOG(T value) { 3 std::stringstream ss; 4 ss << value; 5 writelog(ss.str().c_str()); 6} 7template<> 8inline void APPLOG(char value) { 9 APPLOG(static_cast<int>(value)); 10}

...が。Chironianさんの回答の方がよさそうですね。
この追記が参考程度にでもなれば幸いです。

投稿2017/09/27 13:29

編集2017/09/27 13:48
LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aquaS

2017/09/27 13:35

マクロのvalueにはlongやポインタも渡ってくるので、型を識別する必要が有ります。 その識別でいい方法は無いでしょうか? stringstreamにやらせようとしたのですが、うまくいかないという状況です。
LouiS0616

2017/09/27 13:37

マクロでなくてはいけないのですか? テンプレート関数など使えばいろいろ工夫できそうですが。
aquaS

2017/09/27 13:59

LouiS0616さんのコードも大変勉強になりました。 参考にさせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問