電子書籍の厳選無料作品が豊富!

こんにちは。

C言語において、以下のような2つの関数を利用して、全角文字を含んだ文字列の並びを逆順にする事を考えました。
ちなみにコンパイラは、borlandのC++コンパイラを使っています。

文字コードがShift_JISの場合、全角文字の上位バイトが0x81~0x9F、0xE0~0xFCの範囲に収まるという事を聞いたので、まず、以下のように、渡された文字が、全角文字の上位バイトかどうかを判定する関数を作りました。
____________________________________________________________
int is_2byte(unsigned char c){
return ( ( (c >= 0x81) && (c <= 0x9f) ) || ( (c >= 0xe0) && (c <= 0xfc) ) );
}
____________________________________________________________

次に、上の関数を利用し、以下のように、渡された文字列の、文字の並びを逆順にする関数を作りました。
____________________________________________________________

void rev_str(char *str)
{
char temp[1000];
char tmp;
int i, j;

for(i=strlen(str)-1, j=0; i>=0; i--, j++){
temp[j]=str[i];
if(is_2byte(temp[j])){
tmp=temp[j-1];
temp[j-1]=temp[j];
temp[j]=tmp;
}
}
temp[j]='\0';
strcpy(str, temp);
}
__________________________________________________

この関数を、あいうえお順に試して行った所、ひらがなの
「あいうえお かきくけこ さしすせそ たちつてと なにぬねの はひふへほ まみむめ」
という文字列は、逆順にする事ができたのできました。
しかし、「も」以降の文字を含ませた途端、実行時エラーが発生し、プログラムがストップしてしまいます。
また、カタカナの場合は、「メ」以降の文字を含ませた場合に、実行時エラーとなります。

何が問題なのかが全然分からないので、困っています。
何かいい方法を知っておられる方がいらっしゃれば、是非アドバイスを頂きたいと思います。
では、よろしくお願い致します。

A 回答 (11件中11~11件)

下位バイトの範囲は調べられましたか?


調べた上で、is_2byte()で上位バイトかどうか判定できると思われますか?
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

>下位バイトの範囲は調べられましたか?
調べ回ったところ、

「SJIS で JISX0201 以外の文字は1文字2バイトで表します。 上位バイトは 0x80-0x9F, 0xE0-0xFC 下位バイトは 0x40-0x7E, 0x80-0xFC の範囲を取り、合計 11468 文字 定義できます。」

という文を見つけました。
下位バイトが 0x40-0x7E, 0x80-0xFC の範囲にあるかどうかを判定すれば、2バイト文字を検出できるかも知れませんね。
一度試してみます。

お礼日時:2011/09/11 05:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!