![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
こんにちは。
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);
}
__________________________________________________
この関数を、あいうえお順に試して行った所、ひらがなの
「あいうえお かきくけこ さしすせそ たちつてと なにぬねの はひふへほ まみむめ」
という文字列は、逆順にする事ができたのできました。
しかし、「も」以降の文字を含ませた途端、実行時エラーが発生し、プログラムがストップしてしまいます。
また、カタカナの場合は、「メ」以降の文字を含ませた場合に、実行時エラーとなります。
何が問題なのかが全然分からないので、困っています。
何かいい方法を知っておられる方がいらっしゃれば、是非アドバイスを頂きたいと思います。
では、よろしくお願い致します。
No.1
- 回答日時:
下位バイトの範囲は調べられましたか?
調べた上で、is_2byte()で上位バイトかどうか判定できると思われますか?
ご回答ありがとうございます。
>下位バイトの範囲は調べられましたか?
調べ回ったところ、
「SJIS で JISX0201 以外の文字は1文字2バイトで表します。 上位バイトは 0x80-0x9F, 0xE0-0xFC 下位バイトは 0x40-0x7E, 0x80-0xFC の範囲を取り、合計 11468 文字 定義できます。」
という文を見つけました。
下位バイトが 0x40-0x7E, 0x80-0xFC の範囲にあるかどうかを判定すれば、2バイト文字を検出できるかも知れませんね。
一度試してみます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# c言語 int temp = 0; if(isdigit(arr[i])){ temp=arr[i] 2 2022/03/27 01:44
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# int temp = 0; if(isdigit(arr[i])){//文字が数字であれば(0~9) 1 2022/03/27 01:37
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- PHP c言語 文字 - '1'+26 3 2022/03/26 20:58
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 1 2022/04/01 12:11
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テキストデータをそのままバイ...
-
C言語について。
-
charでの計算?
-
fgetsなどのときのstdinのバッ...
-
C言語です
-
絶対パスからのファイル名の切...
-
-'0'の意味について
-
CStringをwchar_tに変換したい
-
文字列から空白を取り除きたい...
-
全角文字を含んだ文字の並びを...
-
干支のプログラム
-
3桁区切(コンマ)記号をつけ...
-
YUV⇔RGB変換がうまくいきません。
-
WORDをcharに変換する方法
-
enumの記述について。
-
C言語プログラミングについて(...
-
Linuxでフォルダ内全ファイル名...
-
strncpyと_tcsncpy_sのヌルの扱...
-
str系関数を使わずに二つの文字...
-
'const char *' 型は 'char *' ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
C言語のfor文です。 繰り返しの...
-
テキストデータをそのままバイ...
-
charでの計算?
-
文字列から空白を取り除きたい...
-
charからLPTSTRへの変換方法
-
atoi( ) の反対をやりたい
-
2曲同時再生するにはどうした...
-
C言語の入力した文字を反転させ...
-
配列をnビットシフトする
-
3桁区切(コンマ)記号をつけ...
-
int main()の・・・
-
型変換
-
CStringをwchar_tに変換したい
-
'const char *' 型は 'char *' ...
-
間接操作のレベルとは
-
double型の値をchar配列に変換...
-
絶対パスからのファイル名の切...
-
switch文で文字を比較すること...
-
c++ 文字列を入力して、一文字...
おすすめ情報