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

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

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

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

Q&A

解決済

3回答

1371閲覧

C言語の文字型配列とポインタについて

fullmagic26

総合スコア12

ポインタ

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

0グッド

1クリップ

投稿2018/10/04 08:53

編集2018/10/04 14:15

前提・実現したいこと

c言語を使って入力された文字列を反転させたい。


入力:abcde
出力:edcba

入力:あいうえお
出力:おえういあ

発生している問題・エラーメッセージ

半角では正しく表示されたのですが、全角ではうまく表示されません。

該当のソースコード

C

1#include <stdio.h> 2 3 4int main(void) 5{ 6 char name1[11]; 7 char *p_name1; 8 int cnt; 9 10 p_name1 = name1; 11 12 //入力 13 printf("文字列を入力してください:"); 14 scanf("%s", name1); 15 rewind(stdin); 16 17 //元の文字列を出力 18 for (cnt = 0; cnt < 100; cnt++) 19 { 20 if (*(p_name1 + cnt) == '\0') 21 { 22 cnt--; //ヌル文字の一つ前にポイントを移動させる 23 break; 24 } 25 printf("%c", *(p_name1 + cnt)); 26 } 27 printf("\n"); 28 29 //反転させた文字列を出力 30 for (; cnt >= 0; cnt--) 31 { 32 printf("%c", *(p_name1 + cnt)); 33 } 34 printf("\n"); 35 36 return 0; 37}

試したこと

半角と全角で処理を分岐させようとしましたが、そのやり方もよくわかりませんでした。

補足情報(FW/ツールのバージョンなど)

Microsoft Visual Studio Professional 2017
Version 15.7.5
文字コード:Shift-JIS

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

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

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

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

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

fullmagic26

2018/10/04 08:56

途中送信してしまいました
y_waiwai

2018/10/04 08:57

編集できるので、追記してください
cateye

2018/10/04 10:22

全角の文字コードは何でしょう? shift-jis,jis,utf-8いろいろあるので確認が必要です。windowsならshift-jisかな?
guest

回答3

0

ベストアンサー

Shift_JISですか…。
全角というのが「すべての文字が全角」なら2バイトづつ読むだけですが、全半角が混在している場合、Shift_JISは後ろから読むことは不可能(※)ですので、面倒です。
後ろから1文字取るたびに前からその文字までを読むか、
あるいは文字列が入力されるときに1文字づつ切り分けて配列に入れるなどデータ構造を変える必要があります。
文字コードをUTF-8やUTF-16に変えるのが楽です。

※例を上げておきます。
「≠≠≠≠≠≠≠≠≠≠≠≠≠≠≠、」と「aaaaaaaaaaaaaaaA」は先頭1バイトの差異で続く全文字の解釈が変わります。

投稿2018/10/04 16:21

編集2018/10/05 00:30
ikadzuchi

総合スコア3047

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

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

0

いわゆる半角文字、というのは1文字1バイトです。
が、全角文字は、1文字複数バイトとなります

ということで、現状のように、単純に文字列のバイトデータを逆に出力するだけではダメだ、ということが分かると思います。

この場合、最後の文字位置、その一つ前の文字の文字位置、またその一つ前の文字位置、というふうにして文字出力する必要があります。

投稿2018/10/04 10:12

y_waiwai

総合スコア87747

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

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

fullmagic26

2018/10/04 13:45

文字の位置を調べるためにはどうしたらいいのでしょう?
y_waiwai

2018/10/04 13:52

使っている文字コードによってそれは変わるんで、まずはそれをはっきりさせてからの話となりますね
y_waiwai

2018/10/05 01:39

質門のことを実現するためには、 ・文字列の文字数を求める関数 ・文字列のxx文字目の位置を求める関数 ・文字列のxx位置の文字を取得する関数 を作れば、できますね
guest

0

UTF-8 は、(一般的な)英数字以外は、複数バイトとなります。
Unicode.orgに規約があると思ったのですが、見つからなかったので、 UTF-8の冗長なエンコード を参照すると、
最初のバイトの MSBが 0 の場合、1バイト、 0b110xxxxx : 2バイト、0b1110xxxx : 3バイト、 0b11110xxx : 4バイトで、 一文字を表します。
最初のバイトを読み込んで、上記のどれに該当するかで、対応する複数バイトを一文字として扱う必要があります。

実際のコードは難しくは無いですが、ちょっと面倒。 (確認が面倒)

投稿2018/10/04 13:47

pepperleaf

総合スコア6383

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

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

pepperleaf

2018/10/05 11:21

あ、いつの間にか、文字コードが UTF-8 から、Shift-JISになってる。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問