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

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

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

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

Q&A

解決済

5回答

3420閲覧

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

CreeperSaviour

総合スコア129

C

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

0グッド

0クリップ

投稿2019/02/07 07:32

編集2019/02/07 08:21

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

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

該当のソースコード

C

1#include <stdio.h> 2 3#define STR 0x25a0 4 5int main() { 6 printf("%x\n", STR); // -> 25a0 7 printf("%d\n", STR); // -> 9632 8 printf("%c\n", STR); // -> � 9 printf("%s\n", STR); // -> (Segmentation fault) 10 return 0; 11}

試したこと

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

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

補足情報

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

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

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

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

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

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

guest

回答5

0

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

C

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

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

C

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

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

投稿2019/02/07 08:08

otn

総合スコア84538

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

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

CreeperSaviour

2019/02/07 08:19 編集

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

2019/02/07 08:25

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

2019/02/07 08:31

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

0

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

c

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

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

投稿2019/02/07 07:59

ttyp03

総合スコア16998

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

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

CreeperSaviour

2019/02/07 08:12

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

0

ベストアンサー

c

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

投稿2019/02/07 07:44

ozwk

総合スコア13521

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

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

CreeperSaviour

2019/02/07 07:48

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

2019/02/07 07:56 編集

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

2019/02/07 07:58

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

2019/02/07 08:03 編集

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

2019/02/07 08:04

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

0

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

投稿2019/02/07 07:41

jimbe

総合スコア12646

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

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

CreeperSaviour

2019/02/07 07:52

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

2019/02/07 08:39

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

2019/02/07 08:41

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

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 07:40

編集2019/02/07 08:09
cateye

総合スコア6851

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

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

CreeperSaviour

2019/02/07 07:43

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

2019/02/07 08:03 編集

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

2019/02/07 08:05

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問