全角文字と半角文字が混合している文字列に文字を追加するプログラムを考えています。
仕様としては全角から半角に変わる際には全角文字の後ろに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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- Excel(エクセル) capeofdragonと申します Excel2016を使っておりまして 半角又は全角の任意文字列が 2 2022/10/31 13:51
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- Access(アクセス) Accessのテキストボックスの入力文字制限 1 2023/01/18 20:43
- その他(データベース) Accessのクエリで1フィールドの抽出条件設定をNullでなく全角半角含む空白のみの文字列でない文 1 2023/04/24 15:20
- その他(Microsoft Office) WordやExcelで英数字のみ半角または全角にしたい 6 2022/08/03 08:18
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
一番右のスペース以降の文字列...
-
機種依存文字と特殊文字について
-
文字列から、null値を除去する方法
-
マルチバイト混在の文字列整形
-
エンコード・デコードの仕方
-
エクセルで13,410円を数値の134...
-
「シフトJIS X 0213」形式の文...
-
VBA 変数名に変数を使用したい。
-
【VB】コンボボックスにデータ...
-
WORD VBA プログラム修正をお願...
-
クリスタルレポートで困ってい...
-
Excel VBAでグループ毎に集計す...
-
Dir関数で読み取り順を操作でき...
-
VBとアクセスでSQL文に変...
-
エクセルデータをVBで検索でき...
-
CSVファイルのエクスポートでソ...
-
AccessからExcelへエクスポート...
-
構造体配列の一部初期化!!!
-
ExcelVBAについて
-
VB6で、一次元配列と二次元配列...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CString型 全角半角を意識せず...
-
EXCELのVBAでLenB関数について
-
ファイル名の一部削除について
-
文字列から、null値を除去する方法
-
TextFieldParserの固定長桁数を...
-
StrConvでUnicodeに変換出来な...
-
一番右のスペース以降の文字列...
-
VBScriptで半角カナと半角英数...
-
【Excel VBA】セル内テキストの...
-
アクセス ステータスバーの文...
-
「シフトJIS X 0213」形式の文...
-
WSTRINGとは?
-
エクセルで13,410円を数値の134...
-
VBからID3タグをいじる方法
-
VB6のテキストボックスに入力し...
-
HEX
-
指定バイト目を取り出すにはど...
-
C言語とWin32APIで全角かなの...
-
vb2008 MIDB関数
-
ASC関数
おすすめ情報