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

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

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

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

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

10690閲覧

C言語 全角文字と半角文字

deluhi0905

総合スコア22

C

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

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

1クリップ

投稿2014/10/31 13:43

ご質問いたします。
入力した全角文字列と半角文字列を配列に格納し区別をつける処理を作成しましたが、
全角と半角文字列を配列に格納してから「逆」に表示させることは可能でしょうか。

下記ソースコードは全角・と半角の区別をつけています。

int utfcheck(unsigned char c) /* 符号付き無しの文字ビット /
{
if(c&0x80)
{
return 1; /
全角文字なら1を返す /
}
return 0; /
半角文字なら0を返す */
}

OSはLINUX、コンパイラはgcc、
文字コードはUTF-8で、半角文字が1文字1バイト、全角文字が1文字3バイト配列に格納されます。

ご回答お願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

逆とは、"あいう" => "ういあ" のようなことですかね。
そういうの書いたことないので、書いてみました。

lang

1#include <stdio.h> 2#include <string.h> 3 4main(){ 5 int c; 6 char *p, *q; 7 char in[] = "あaい01"; 8 char out[100]; 9 char work[6], *w; 10 11 q = out; 12 w = work; 13 for(p=in+strlen(in)-1; p>=in; p--){ 14 if((*p&0x80)==0){ /* 1バイト文字 */ 15 *q++ = *p; 16 }else if((*p&0xC0)==0x80){ /* 複数バイトの2バイト目以降 */ 17 *w++ = *p; 18 }else{ /* 複数バイトの先頭 */ 19 *q++ = *p; 20 while(w>work){ 21 *q++ = *--w; 22 } 23 } 24 } 25 *q = 0; 26 27 printf("%s\n",out); 28}

工夫すれば、work無しで出来ると思います。

投稿2014/11/01 11:10

otn

総合スコア84551

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

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

deluhi0905

2014/11/03 09:36

otn さん ご回答いただきありがとうございます。 --------------------------------------------------------------------- for(p=in+strlen(in)-1; p>=in; p--){ if((*p&0x80)==0){ /* 1バイト文字 */ > *q++ = *p; }else if((*p&0xC0)==0x80){ /* 複数バイトの2バイト目以降 */ > *w++ = *p; }else{ /* 複数バイトの先頭 */ > *q++ = *p; while(w>work){ > *q++ = *--w; } } } > *q = 0; --------------------------------------------------------------------- ソースコードですが、バイト文字の比較を行っているのは理解できたのですが、 「>」の個所の流れが掴めません。「複数バイトの2回目以降」は何をやっているのでしょうか。 恐れ入りますが、それぞれの役目が何を行っているのか教えていただけないでしょうか。
otn

2014/11/03 10:49

方針として、(私にとって)わかりやすくするために、バイト配列を1バイトずつ逆順に見ていき、後戻りしない(一度見た配列要素を二度と見ない)ということにしました。 なので、複数バイト文字の一部であるとわかったものを別のwork配列に保存しておきます。3バイト目を保存して次に2バイト目を保存します。 複数バイト文字の先頭バイトが出てきた段階で、まず先頭バイトを出力して、さっきwork配列に保存したバイト列を逆順に取り出します。最後に保存した2バイト目を最初に取り出して先頭バイトの次に出力、さらにその前に保存した3バイト目を取り出して出力します。 最初に書いた方針でなくて、入力配列の複数バイト文字の末尾位置を記憶するポインタを使うとwork配列無しで出来ると思います。状態を持つことになるので考えるのがめんどくさいと思ったのですが、いま考え直すとそんなに面倒ではないですね。 勉強のためでなく実用のためなら、他の方が書いているようにライブラリを使うんでしょうね。
deluhi0905

2014/11/04 14:42

otn さん コメント頂きありがとうございます。 ソースコードの説明ありがとうございます。処理の流れが掴めました。 自分が解りやすくして、尚且つ第三者が見ても解りやすいソースを作成していきます。 ご回答頂きありがとうございました。
guest

0

C 言語で日本語を扱うのは結構大変なので、すべて自分で実装するのは現実的ではないです。
普通はライブラリーやフレームワークの関数を使います。

その際の方針としては次の 2 つです。

  1. 入力、出力の際に変換し、内部では 16 または 32 ビット Unicode (wchar_t) で扱う
  2. UTF-8 で統一し、文字列操作は専用の関数群を使う

1 の方針だと日本語も 1 文字として扱えて処理しやすいので、こちらが主流だと思います。

ただ、 linux で C 言語だとすると glib が使えるのですが、こちらは 2 の方針です。
glib を使うのであれば g_utf8_strreverse() という関数があるので、これで反転できます。

投稿2014/11/03 01:52

yohshiy

総合スコア863

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

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

deluhi0905

2014/11/04 14:48

yohshiy さん ご回答頂きありがとうございます。 1,2の方針の説明、ありがとうございました。 今回は配列やポインタ等を使用して全角・半角文字を逆順に表示するやり方で行きますが、1や2の方針でも試してみようと思います。 ご回答頂きありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問