回答編集履歴

1

訂正

2018/07/31 04:40

投稿

ttyp03
ttyp03

スコア16998

test CHANGED
@@ -41,3 +41,55 @@
41
41
  もしVisualStudioをお使いなら`_ismbblead`関数が使えると思うので、そちらを使ったほうが楽と思います。
42
42
 
43
43
  [https://msdn.microsoft.com/ja-jp/library/3hd1xf60.aspx](https://msdn.microsoft.com/ja-jp/library/3hd1xf60.aspx)
44
+
45
+
46
+
47
+ 訂正
48
+
49
+ 皆さんの回答より1バイト目のみ判定では不完全であることがわかりました。
50
+
51
+ 私の中途半端な知識でご迷惑をおかけしました。
52
+
53
+ やはり先頭から順に見ていく必要があるということで、判定処理を考えてみました。
54
+
55
+ ```c
56
+
57
+ unsigned char *p = cBuffer;
58
+
59
+ int f = 0;
60
+
61
+ while(*p != 0x00) {
62
+
63
+ if(f == 2){
64
+
65
+ f = 3; // 全角2バイト目
66
+
67
+ } else
68
+
69
+ if((0x81 <= *p && *p <= 0x9f) || (0xe0 <= *p && *p <= 0xef)){
70
+
71
+ f = 2; // 全角1バイト目
72
+
73
+ } else {
74
+
75
+ f = 1; // 半角
76
+
77
+ }
78
+
79
+ p++;
80
+
81
+ }
82
+
83
+ if(f == 2){
84
+
85
+ *(--p) = 0x00;
86
+
87
+ }
88
+
89
+
90
+
91
+ /*--------文字列の出力--------*/
92
+
93
+ printf("入力した文字列は「%s」です。\n", cBuffer); /* 入力した文字列を出力 */
94
+
95
+ ```