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

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

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

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

Q&A

3回答

1802閲覧

char型配列を分ける処理

shunx2

総合スコア11

C++

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

0グッド

0クリップ

投稿2018/07/03 03:26

編集2018/07/03 03:28

char型の配列があり、ほかのchar型の配列を分けてたいです。
イメージは一行のある文字列を3行にわけて表示させたい。

char buf[48] = “名前2018/0703質問です。よろしくお願いします!!” ;

これを
char one[16];
char two[16];
char three[16];
この3つの配列に分けて欲しいです。
半角、全角がごちゃまぜの状態で分けることを想定としてご教授お願いします。

文字コードはS-JISでOSはLinux、コンパイルはgcc
よろしくお願いします。

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

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

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

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

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

ttyp03

2018/07/03 04:23

全角文字は分割されても良いのでしょうか?15バイトずつ分けると、「よろしく」の「し」が分割されます。分割しないのであれば、twoかthreeの要素数が足りなくなりますね。
shunx2

2018/07/03 05:20

よろしくの「し」は分割するばあいは次の配列に「し」が来るようにして欲しいです。
shunx2

2018/07/03 05:22

要素数が足りなくなったらオーバーした文字は格納しなくてよいです。
ttyp03

2018/07/03 07:06

で、上記条件で実装するにあたって何がわからないのでしょうか?
shunx2

2018/07/03 10:07

1バイトずつ読み込むにあたって全角か半角なのか判定する方法がわからないです。
guest

回答3

0

ShiftJISなら、全角文字の1文字目、2文字目の判定ができるので、
#ぐぐればでてきます

・文字数を数える関数を作る
・指定した文字数を切り出す関数を作る

以上で実現できますね

投稿2018/07/03 03:41

y_waiwai

総合スコア87774

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

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

0

localeに依存しますがmblenが使えます。

まず、locale -aコマンドで使えるロケールを確認します。
sjisが使えそうなやつ(ja_JP.SJIS的な)がなければ
sudo localedef -f SHIFT_JIS -i ja_JP /usr/lib/locale/ja_JP.SJISコマンドで追加します。
(Centos7の場合、他のLinuxの場合も同じなのかは要確認)

後は、

c

1#include <stdio.h> 2#include <stdlib.h> 3#include <locale.h> 4 5int main(void) 6{ 7 const unsigned char s[] = "\x96\xBC\x91\x4F2018/0703\x8E\xBF\x96\xE2\x82\xC5\x82\xB7\x81\x42\x82\xE6\x82\xEB\x82\xB5\x82\xAD\x82\xA8\x8A\xE8\x82\xA2\x82\xB5\x82\xDC\x82\xB7!!"; 8 int len, i=0; 9 10 setlocale( LC_CTYPE, "ja_JP.SJIS" ); 11 12 while( s[i] != '\0' ){ 13 len = mblen( (char*)&s[i], MB_CUR_MAX ); 14 printf( "%d ", len ); 15 if(len == -1){ 16 puts("不正な文字です"); 17 return 0; 18 } 19 i += len; 20 } 21 22 return 0; 23}

で、それぞれの文字が何バイトかが取得できます。

投稿2018/07/03 17:22

asm

総合スコア15147

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

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

0

Shift-JISコードの判定は、文字コードでするしかありません。
検索すると、Wikipediaとかにもありますが、、例えば、
文字コード表 シフトJIS(Shift_JIS)
とか。
最初のバイトが、0x80-0xA0, 0xE0-0xFF の場合、2-byteコードとする。(判定関数があった気もするが、忘れた) 厳密ではないが、2-byteコードを全角とみなせば、良いと思います。

で、読み込んだ文字列を頭から、調べてゆけば、良いでしょう。
2-byteコードを読み込んだ時、格納する配列の残りが、1-byteの時、次の配列に入れる事になるでしょうか。

この当たりが分かれば、次へ進めるでしようか?

投稿2018/07/03 13:43

pepperleaf

総合スコア6383

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問