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

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

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

charは文字データ型を指します。一文字分の文字コードの格納を想定としている型です。

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

C++

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

Q&A

解決済

3回答

1141閲覧

Char型のポインタで参照された文字列を文字列順に出力したい

morikuri

総合スコア12

char

charは文字データ型を指します。一文字分の文字コードの格納を想定としている型です。

標準出力

標準出力(stdout)は、プログラムが標準的に用いるデータ出力元。標準出力に書き込み要求を発行しすることにより、ディスプレイ装置にデータを表示することができます。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

C++

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

0グッド

0クリップ

投稿2019/12/29 10:00

実行環境
Windows10
Microsoft Visual Studio Community 2019
Version 16.3.6

#実現したいこと
Char型のポインタで参照された文字列を文字列順に出力したい
#知りたいこと
なぜこのポインタに何か文字列を足して出力すると予期しない結果が出るのかが知りたいです。

C++

1#include <iostream> 2using namespace std; 3 4int main() { 5 6 char a[] = "あいうえお";//配列の初期化 7 char* p = a;//ポインタの初期化 8 9 for (; *p; p++) {//for文による配列のループ 10 cout << *p << "\n"; //配列の中身がすべてでるまで出力 11 } 12 return 0; 13}

###---結果---

 「 、 ヲ ィ

#試してみたこと
・1.文字列を追加しない
・2.文字コードとの関連性について調べる
#1.文字列を追加しない

C++

1#include <iostream> 2using namespace std; 3 4int main() { 5 6 char a[] = "あいうえお";//配列の初期化 7 char* p = a;//ポインタの初期化 8 9 for (; *p; p++) {//for文による配列のループ 10 cout << *p; //配列の中身がすべてでるまで出力 11 } 12 return 0; 13}

###---結果---

あいうえお

というように文字列をそのまま出力することはできます
ですがこのままでは文字列を追加することはできず不便です
それになぜポインタに文字列を追加して出力すると予期しない結果になるのかが不可解です
#2.文字コードとの関連性について調べる
なんとか判別できる文字の文字コードを調べてみたのですが

区 点 JIS SJIS EUC UTF-8 UTF-16 字 04 04 2424 82A2 A4A4 E38184 3044  い 01 54 2156 8175 A1D6 E3808C 300C 「 04 06 2426 82A4 A4A6 E38186 3046 う 01 02 2122 8141 A1A2 E38081 3001 、 04 10 242A 82A8 A4AA E3818A 304A お 05 03 2523 8342 A5A3 E382A3 30A3 ィ

関連性は特に感じられるものはありませんでした。

#推測したこと
おそらくではありますが

C++

1cout << *p << "\n";

この文を実行しcoutにアドレスか値を渡すときに
何らかの形で変化したのではないかと考えています
#是非ご回答お願いします。
入門したてで判断がつかずじまいで考えている状態です
どうかご教示ください。
本当によろしくお願いします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

既に皆さんがご指摘されているとおり、charやcoutでは全角文字が期待通りに表示できません。

charの代わりにwchar_t
coutの代わりにwcout

を使うことでお望みどおりの出力が得られるはずです。

また、コンソールも設定を変えてやらないとunicode文字を出力しても表示されません。

C++

1int main() 2{ 3 // コンソールのロケールを設定 4 ::_wsetlocale(LC_ALL, L"Japanese"); 5 6 wchar_t a[] = L"あいうえお";//配列の初期化 7 wchar_t * p = a;//ポインタの初期化 8 9 for (; *p; p++) {//for文による配列のループ 10 wcout << *p << "\n"; //配列の中身がすべてでるまで出力 11 } 12 return 0; 13}

投稿2019/12/29 12:26

編集2019/12/29 12:27
KoichiSugiyama

総合スコア3041

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

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

0

charは1バイトの値です。*ppのポイントするメモリの1バイトの値です。

なので、1文字1バイトの文字列であれば、このプログラムで大丈夫です。

C++

1char a[] = "abcdefg";

のようないわゆる全角平仮名は、エンコーディングによって2バイトか3バイトです。
UTF-8だと3バイトです。

なので、文字を判別して文字により1バイトずつとか3バイトずつ処理するとかの必要があります。
UTF-8だと、1バイト目を見れば、その文字が何バイトかわかります。

あるいは、ワイド文字を使うという手もありますが、これはよく知りません。
ちょっとやってみると、私の環境ではワイド文字列リテラル(L"あいうえお")はUTF-16になりました。

投稿2019/12/29 12:05

otn

総合スコア84557

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

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

0

1バイト置きに改行が入っています。
「追記」
当方の環境は、UTF-8です。

text

1usr ~/Project/test % ./a.out 234567usr ~/Project/test % cat t1.cpp 8#include <iostream> 9using namespace std; 10 11int main( ) 12{ 13 14 char a[] = "あいうえお"; 15 char *p = a; 16 17 while(*p) { 18 cout << *p++; 19 cout << *p++; 20 cout << *p++ << "\n"; 21 } 22 return 0; 23}

投稿2019/12/29 10:06

編集2019/12/29 10:37
cateye

総合スコア6851

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

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

cateye

2019/12/29 10:38

エラーチェックも何もしていないので、自分なりに検証して下さい。
morikuri

2019/12/29 11:51

回答ありがとうございます! 書いてくださったプログラムを私の環境で実行してみたところ このような結果になりました あ 「う え ィ フ フフフ フフフ フフフ フフフ フフフ フフフ フフフ フフフ フフフ フフフ フフフ フフフ  !} UTF-8やunicodeに変更して実行しても大した違いはありませんでした visualstudioのバージョンも最新にしてみましたが特に変わりませんでした ですが実行するたびに最下行の「フフフ」から下の文字列が別の文字列に変わることがわかりました それとブラウザでC++言語を実行できるサービスで記入し実行してみると 回答者さまの回答と同じく一行ずつ改行された「あいうえお」がでてきました どうやら私の環境だけでしかでないようです どうすれば回答者さまやブラウザの実行時のような結果が得られるかが見当もつきません 思い当たることがあればどうか回答お願いします。 プログラムまで記述してくださりありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問