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

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

ただいまの
回答率

90.36%

  • C

    4218questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

defineで定義した文字(0x〇〇〇〇)を標準出力させたい

解決済

回答 5

投稿 編集

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

CreeperSaviour

score 37

私はUbuntuで開発していて、そのコードをWindowsでも読むことがあるのですが、□や■などが文字化けするので、□なら0x25A1、■なら0x25A0(ASCIIコード変換機より)と置き換えてコードを書いたところ、terminalで出力したときに文字化けが起こります。
charは1バイトなので出力ができないから文字化けすると私は思っているのですが、%sで出力するとSegmentation faultが発生するので解決法が分からず、こちらで質問させていただくことにしました。回答よろしくお願いします。

ご指摘いただきましたが、ASCIIコードではなくUTF-8の方で、0xE296A0や0xE296A1でした。申し訳ありません。

該当のソースコード

#include <stdio.h>

#define STR 0x25a0

int main() {
    printf("%x\n", STR); // -> 25a0
    printf("%d\n", STR); // -> 9632
    printf("%c\n", STR); // -> �
    printf("%s\n", STR); // -> (Segmentation fault)
    return 0;
}

試したこと

文字配列にすればいいのかと思い

char c[] = {STR};
-> コンパイルエラー

補足情報

Ubuntu 18.04.1 LTS
Windows10(学校)
Terminalの文字コード: Unicode - UTF-8
エディタの文字コード: UTF-8

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 5

checkベストアンサー

0

    char box_blank[4] = {0xe2,0x96,0xa1,'\0'};
    char box_fill[4] = {0xe2,0x96,0xa0,'\0'};
    printf("%s\n",box_blank); //□
    printf("%s\n",box_fill); // ■

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/02/07 16:48

    回答ありがとうございます。
    http://ash.jp/code/unitbl21.htm
    こちらを参照し、0xe2,0x96,0xa1の意味は理解しましたが、0x25a0ではなぜ駄目だったのかが分かりません。お手数ですが、ご指摘くださると幸いです。

    キャンセル

  • 2019/02/07 16:52 編集

    1. 文字列は結局の所配列なので、printf("%s",0x25a0 )だと0x25a0がアドレスと解釈されてしまう
    2. 1を踏まえて{0xa0, 0x25, '\0'}という文字列を表示することにしたところでそもそも■じゃない
    (UTF-8だって言っているのになぜASCIIコードの変換機使ったのか...)

    キャンセル

  • 2019/02/07 16:58

    文字コードの理解がしっかりできていないままコードを書いていました。申し訳ありません。
    それでは、
    #define STR 0xe296A1
    これを実際に扱うことはできないのでしょうか。
    printf("%c\n", STR); // 当然文字化けが起こりますが...

    キャンセル

  • 2019/02/07 17:01 編集

    というかコードをUTF-8で書いて
    windowsでUTF-8で開けるエディタ使えば済む話では?

    キャンセル

  • 2019/02/07 17:04

    windows環境の方は学校のpcでして、困難な話です。

    キャンセル

0

#include <stdio.h>

#define STRING(str) #str

int main(void)
{

    puts(STRING(0x25a0));

    return 0;
}


usr ~/Project/test % ./a.out 
0x25a0
usr ~/Project/test %
「追記」

#include <stdio.h>

#define STR 0x25a0

int main(void)
{
    char buf[16];
    sprintf(buf,"0x%x",STR);


    puts(buf);

    return 0;
}


usr ~/Project/test % ./a.out
0x25a0
usr ~/Project/test % cat t1.c 

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/02/07 16:43

    回答ありがとうございます。
    コンパイルエラーで
    stray '#' in program
    でした

    キャンセル

  • 2019/02/07 16:53 編集

    失礼、訂正しました^^; マクロの#について調べてください。・・・見直したら題意に沿わないようです、無視してください。すみません

    キャンセル

  • 2019/02/07 17:05

    #というのを初めて知り知識が増えました。ありがとうございます。

    キャンセル

0

%s は, 指定したアドレスから \0 までのデータを文字列として表示するものです.
0x25a0 を渡せば, メモリの 0x25a0 から表示しようとして, セグメンテーションフォルトが発生するものと思います.
メモリ上で 0x25,0xa0,0x00 と並ぶようなバイト配列を作り, そのアドレスから %s で表示すれば良いのではと考えます.

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/02/07 16:52

    回答ありがとうございます。
    %sについては、文字配列の最後まで全て出力するものだと勘違いしていました。
    ただ、0x25a0が悪いのか、%�と出力されるので、ozwkさんの回答を試してみたところ、(0xe296a1)出力自体はできました。

    キャンセル

  • 2019/02/07 17:39

    「文字配列の最後まで全て出力するもの」であれば, 配列にして渡さなければとお考えになるべきだったと思います.
    そして, C では配列の最後は(アドレスだけでは)分かりません. その為に「文字列は '\0' で終わる」ということになっているのです.

    キャンセル

  • 2019/02/07 17:41

    ご指摘ありがとうございました。

    キャンセル

0

コードはUTF8のものを使いましょう。
今の形のコードで実現するとこんな感じになるかと。

#define STR 0xe296a1
printf("%c%c%c\n", STR >> 16 & 0xff, STR >> 8 & 0xff, STR & 0xff);


面倒なので文字列化したほうがよいですね。。。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/02/07 17:12

    回答ありがとうございます。
    ご指摘の通り、UTF-8のものを使用していませんでした。申し訳ありません。
    文字列化も考えているのですが、
    #define PRINT_STR printf("%c%c%c\n", STR >> 16 & 0xff, STR >> 8 & 0xff, STR & 0xff)
    として利用するかもしれません。

    キャンセル

0

0x25A0とかって、UTF-16ですが、UTF-16を出力しても読めるんでしょうか?なにかの間違いでは?

printf("%c%c\n",STR>>8,STR&255); // UTF-16BEで出力
printf("%c%c\n",STR&255,STR>>8); // UTF-16LEで出力

UTF-8なら、0xE296A0なので、

#define STR 0xE296A0
~~
printf("%c%c%c\n",STR>>16,STR>>8,STR&255);

なんか、意味のない事をしているように思います。
WindowsでもUTF-8を使えるエディタ(メモ帳でも)で扱えばいいのでは?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/02/07 17:17 編集

    回答ありがとうございます。
    UTF-16というより私の勘違いでASCIIコードの変換機を用いていました。
    windows環境の方は主に学校のpcでして、困難な話かと思い、質問させていただきました。(メモ帳は最近のアップデートでUTF-8に対応したという話を聞きますが学校のpcがアップデートしていなかったと...)
    Windows環境の方を細かく記載しないまま質問してしまい、申し訳ありません。

    キャンセル

  • 2019/02/07 17:25

    Windows10ですよね?メモ帳で使えるはずですが、使えなかったとしたらLinuxからのコピーの時点でファイルが壊れているんでしょう。

    キャンセル

  • 2019/02/07 17:31

    わかりました。ご指摘ありがとうございます。

    キャンセル

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

  • ただいまの回答率 90.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

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

  • C

    4218questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。