- ベストアンサー
全角文字と半角文字を判別して文字列を追加
全角文字と半角文字が混合している文字列に文字を追加するプログラムを考えています。 仕様としては全角から半角に変わる際には全角文字の後ろに1234を、 半角から全角に変わるときは半角文字の後ろに4321をつけるというものです。 例1 文字列が「あxxxお」ならば出力結果は「あ1234xxx4321お」 そこで質問なのですが 文字列から全角文字と半角文字をプログラム上で判別して 上記のように出力するにはどうしたらいいんでしょうか? ヒント等ございましたらどうぞお願いします。 とりあえず作ってみた例1の結果を無理やり出力するプログラムのコードを載せておきます。 こちらをうまく改変してくださっても結構ですのでよろしくお願いいたします。 #include <stdio.h> #include <string.h> int main(void){ unsigned char str0[256] = "あxxxお", str1[256] = "1234",str2[256]= "4321"; unsigned int zh,hz, len0 = strlen(str0),len1=strlen(str1),len2=strlen(str2); printf("挿入前:%s\n",&str0); zh=2; //全角から半角に変わる位置 hz=5; //半角から全角に変わる位置 //1234を挿入/// memmove(&str0[zh+len1], &str0[zh], len0 - zh+1); memcpy(&str0[zh], str1, len1); //4321を挿入/// memmove(&str0[hz+len1+len2], &str0[hz+len1], len0); memcpy(&str0[hz+len1], str2, len2); printf("挿入後:%s\n",&str0); return 0; }
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
文字セットが Shift-JISなら _mbsnbcntで何文字目がマルチバイトかシングルバイトか調べて変わり目に対して文字列を挿入するようにしてみましょう 『mbstring.h』をインクリュードします size_t bLen, orgLen、aLen; int bflag = -1; unsigned char* pstr = NULL; aLen = orgLen = strlen( str0 ); // ソースと同じ長さ分の領域を確保 … NULL文字を含めるので+1 pstr = (unsigned char*)malloc( orgLen + 1 ); *pstr = 0; size_t n = 0; printf("挿入前:%s\n", str0 ); while ( n < orgLen ) { bLen = _mbsnbcnt( &str0[n], 1 ); if ( bLen == 2 ) { // マルチバイト文字 if ( bflag == 1 ) { // 前回追加した文字がシングルバイトなら // NULL文字を含めて5バイト分拡張する aLen += 5; pstr = (unsigned char*)realloc( pstr, aLen ); strcat( pstr, "4321" ); } strncat( (char*)pstr, (char*)&str0[n], 2 ); n++; } else { // シングルバイト文字 if ( bflag == 2 ) { // 前回追加した文字列がマルチバイトなら // NULL文字を含めて5バイト分拡張する aLen += 5; pstr = (unsigned char*)realloc( pstr, aLen ); strcat( pstr, "1234" ); } strncat( (char*)pstr, (char*)&str0[n], 1 ); } bflag = (int)bLen; n++; } printf("挿入後:%s\n", pstr ); free( pstr ); といった具合です
その他の回答 (2)
- salsberry
- ベストアンサー率69% (495/711)
#1です。 Shift_JISにおいて、JIS X 0201の文字とJIS X 0208の文字の識別を自分で実装するなら、 「JIS X 0208の文字の1バイト目は 0x81~0x9F または 0xE0~0xFC の範囲」 という決まりを使えばできます。厳密には2バイト目の範囲もチェックする必要がありますが、対象とする文字列がShift_JISで許されている文字のみを含むと分かっているなら、第1バイトのチェックだけで充分です。
- salsberry
- ベストアンサー率69% (495/711)
まずは、使用する文字セットとエンコーディングが何なのかがはっきりしないと、いわゆる「全角」「半角」の判定ができないと思いますよ。
補足
書き忘れていました。 文字セットはSJISです。