
全角文字と半角文字が混合している文字列に文字を追加するプログラムを考えています。
仕様としては全角から半角に変わる際には全角文字の後ろに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;
}
No.2ベストアンサー
- 回答日時:
文字セットが 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 );
といった具合です
No.3
- 回答日時:
#1です。
Shift_JISにおいて、JIS X 0201の文字とJIS X 0208の文字の識別を自分で実装するなら、
「JIS X 0208の文字の1バイト目は 0x81~0x9F または 0xE0~0xFC の範囲」
という決まりを使えばできます。厳密には2バイト目の範囲もチェックする必要がありますが、対象とする文字列がShift_JISで許されている文字のみを含むと分かっているなら、第1バイトのチェックだけで充分です。
参考URL:http://ja.wikipedia.org/wiki/Shift_JIS
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ファイル名の一部削除について
-
VBからID3タグをいじる方法
-
アクセス ステータスバーの文...
-
TextFieldParserの固定長桁数を...
-
EXCELのVBAでLenB関数について
-
HEX
-
エンコード・デコードの仕方
-
クリスタルレポートで文字列の...
-
SQLを発行とは?クエリの作成と...
-
『列名 '担当者CD' があいま...
-
AccessからExcelへエクスポート...
-
DataGridViewに複数テーブルの...
-
VBA 変数名に変数を使用したい。
-
Excel複数シートをaccessへ一括...
-
クリスタルレポート(8.5)の書式...
-
ACCESSのレコード転送について
-
VB6.0 String型→Long型変換方法...
-
Accessのフィールド名に半角括...
-
Redim とEraseの違いは?
-
VB6のメモリ解放に関して
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXCELのVBAでLenB関数について
-
CString型 全角半角を意識せず...
-
TextFieldParserの固定長桁数を...
-
ファイル名の一部削除について
-
一番右のスペース以降の文字列...
-
機種依存文字と特殊文字について
-
StrConvでUnicodeに変換出来な...
-
アクセス ステータスバーの文...
-
セル内の文字を分ける
-
VBからID3タグをいじる方法
-
エクセルで13,410円を数値の134...
-
VBE上の文字検索で「パターン文...
-
VB6.0 文字列のファイル書...
-
文字列から、null値を除去する方法
-
「シフトJIS X 0213」形式の文...
-
HEX
-
エンコード・デコードの仕方
-
【Excel VBA】セル内テキストの...
-
VBAにおける正規表現について教...
-
VBA 変数に使う文字などについて
おすすめ情報