
全角文字と半角文字が混合している文字列に文字を追加するプログラムを考えています。
仕様としては全角から半角に変わる際には全角文字の後ろに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を探す
今、見られている記事はコレ!
-
隣の枝がはみ出してきたら切ってもいい?最もやってはいけないことは?
「隣の木が越境してきて困るが、勝手に切ってはいけないと聞くし…」そう思っている方も多いだろう。実は、2023年4月1日に民法が改正され、この「越境枝」のルールが大きく変わった。 教えて!gooでも「境界から出て...
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
セル内の文字を分ける
-
VBA 変数に使う文字などについて
-
【Excel VBA】セル内テキストの...
-
VBAにおける正規表現について教...
-
VBからID3タグをいじる方法
-
TextFieldParserの固定長桁数を...
-
一番右のスペース以降の文字列...
-
ファイル名の一部削除について
-
マルチバイト混在の文字列整形
-
文字列から、null値を除去する方法
-
EXCEL VBAの課題です
-
【ExcelVBA】値を変更しながら...
-
VB6のメモリ解放に関して
-
excel vbaの配列なんですが・・・
-
VBAで配列引数を値渡しできない...
-
現在コピーされているものによ...
-
PDFのフォーム機能を使ってドロ...
-
vba フィルター 複数条件 3つ以...
-
Web画面のTableから数字を取得...
-
VBA基本構文の作り方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXCELのVBAでLenB関数について
-
StrConvでUnicodeに変換出来な...
-
ファイル名の一部削除について
-
一番右のスペース以降の文字列...
-
CString型 全角半角を意識せず...
-
TextFieldParserの固定長桁数を...
-
エクセルで13,410円を数値の134...
-
「シフトJIS X 0213」形式の文...
-
VB6のテキストボックスに入力し...
-
ASC関数
-
アクセス ステータスバーの文...
-
VBからID3タグをいじる方法
-
【Excel VBA】セル内テキストの...
-
VBScriptで半角カナと半角英数...
-
バイナリデータの取り方
-
全角文字と半角文字を判別して...
-
ワードのVBAで
-
機種依存文字と特殊文字について
-
HEX
-
文字列から、null値を除去する方法
おすすめ情報