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

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

ただいまの
回答率

90.48%

  • C++

    3615questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 850

aquaS

score 143

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

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

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

#define APPLOG(value) \
{ \
  std::stringstream ss; \
  ss << (value); \
  writelog(ss.str().c_str()); \
}

void writelog(const char* log);

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

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

こんにちは。

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

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

#include <iostream>
#include <sstream>

#define APPLOG(value) \
{ \
    std::stringstream ss; \
    ss << #value "="; \
    ss.operator<<(value); \
    writelog(ss.str().c_str()); \
}

void writelog(char const* iStr)
{
    std::cout << iStr << std::endl;
}

int main()
{
    char    x=123;
    APPLOG(x);
    APPLOG(&x);
}


wandbox

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/27 22:46

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

    キャンセル

  • 2017/09/27 22:48

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

    キャンセル

0

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

#include <iostream>
int main(void) {
    char num = 97;
    std::cout << num << std::endl;
    std::cout << static_cast<int>(num) << std::endl;
    return 0;
}

出力

a
97

適当に組んでみました。

template<typename T>
inline void APPLOG(T value) {
    std::stringstream ss;
    ss << value;
    writelog(ss.str().c_str());
}
template<>
inline void APPLOG(char value) {
    APPLOG(static_cast<int>(value));
}

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/27 22:35

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

    キャンセル

  • 2017/09/27 22:37

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

    キャンセル

  • 2017/09/27 22:59

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

    キャンセル

関連した質問

  • 解決済

    エラーメッセージの意味が分からない

    発生している問題・エラーメッセージ 文字列配列を辞書順にソートしてから表示するプログラムです。エラーメッセージは恐らく、無効な引数(型がint) のような内容が書いてあると思うの

  • 解決済

    ファイルの名前を一括で変更したい

    前提・実現したいこと 分析に使用するファイルの名前を連番にしたい。 発生している問題・エラーメッセージ 現在のファイルの名前は 11aw_rtw_0df30441379ebdc

  • 受付中

    ns3でファイルが実行されない

    以前までコンパイルできていたファイルがコンパイルできなくなりました。 sudo apt-get install build-essential libsqlite3-dev l

  • 解決済

    ubuntnu16.04へのアップグレードが途中で、終わる

    アップグレードが、途中のクリーンアップという箇所で、終わり、文字がずらーっと出てきていたシェルが消えてしまいました。このようなケースは、どのようにアップグレードを再開すれば、宜しい

  • 解決済

    ubuntu 構文エラーについて

    bash: 予期しないトークン `newline' 周辺に構文エラーがあります コード このコマンドを打つために、上記コマンドを入力するも、エラーです。 sudo yum

  • 解決済

    シェルソート(降順)の作成

    シェルソート(降順)でソートした数の 先頭5個と末尾5個を表示したいのですが望むような結果になりません。 ご指摘お願いします。 データ数=5 1 5 3 4 2 1,5,3,4

  • 解決済

    sizeof()のキャストについてのアンチパターン

    qiitaの記事を読んでC言語のプログラミングでのアンチパターンを学習しているのですが、 void func() { int loop = 0; struct aaa

  • 解決済

    ubuntu16.04にmozcを入れたい

     前提・実現したいこと Jetson TX1にUbuntuを入れて、それを日本語環境に整えようとしています。 言語サポートは日本語にできたのですが、キーボードのテキスト入力に「mo

同じタグがついた質問を見る

  • C++

    3615questions

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