質問編集履歴

9

修正

2018/07/30 01:39

投稿

Alyn
Alyn

スコア50

test CHANGED
File without changes
test CHANGED
@@ -174,4 +174,6 @@
174
174
 
175
175
 
176
176
 
177
+ 「C言語 fgetsで半分に切れてしまった2バイト文字を判定し、出力させないようにする方法」
178
+
177
- https://teratail.com/questions/138562?sip=n0070000_019%26uid=94168
179
+ https://teratail.com/questions/138562

8

質問を変更

2018/07/30 01:39

投稿

Alyn
Alyn

スコア50

test CHANGED
File without changes
test CHANGED
@@ -168,72 +168,10 @@
168
168
 
169
169
  fgetsやgets_sでは文字以外の不正入力通知やオーバーフローの阻止ができるのでしょうか?
170
170
 
171
- ### fgetsでのソースコード
171
+ ### 追記2
172
172
 
173
- ```C
174
-
175
- #include <stdio.h>
176
-
177
- void main()
178
-
179
- {
180
-
181
- /*--------変数・配列の宣言--------*/
182
-
183
- int iCount = 0; /* 入力した文字数を数える変数 */
173
+ _getch()ではできないみたいなので、新く別の質問を設置しまし。ありがとうございました。
184
-
185
- char cBuffer[200] = {'\0'}; /* 入力した文字を出力するための配列 */
186
174
 
187
175
 
188
176
 
189
- printf("1_文字列を入力し、その文字列をそのまま出力します。\n");
190
-
191
-
192
-
193
- printf("文字列を入力:");
194
-
195
-
196
-
197
- /*--------文字列の入力--------*/
198
-
199
- fgets(cBuffer, 11, stdin);
200
-
201
-
202
-
203
- /*--------NAL文字を配列の最後にする--------*/
204
-
205
- while(cBuffer[iCount] != 0x00)
206
-
207
- {
208
-
209
- if(cBuffer[iCount] == 0x0a)
210
-
211
- {
212
-
213
- cBuffer[iCount] = 0x00;
214
-
215
- putchar('\n'); /* 改行 */
216
-
217
- break;
218
-
219
- }
220
-
221
- iCount++;
222
-
223
- }
224
-
225
-
226
-
227
- /*--------文字列の出力--------*/
228
-
229
- printf("入力した文字列は「 %s 」です。\n", cBuffer); /* 入力した文字列を出力 */
177
+ https://teratail.com/questions/138562?sip=n0070000_019%26uid=94168
230
-
231
- }
232
-
233
- ```
234
-
235
- ### 追記2
236
-
237
- fgetsでこのように作ってみたのですが、このまま「aあああああ」と入力すると「 aああああ・」となってしまいます。
238
-
239
- この"・"のような2バイト文字が半分に切れてしまった文字を判定し、出力させないようにするにはどうしたらよいでしょうか?

7

コード修正

2018/07/30 01:35

投稿

Alyn
Alyn

スコア50

test CHANGED
File without changes
test CHANGED
@@ -172,6 +172,8 @@
172
172
 
173
173
  ```C
174
174
 
175
+ #include <stdio.h>
176
+
175
177
  void main()
176
178
 
177
179
  {
@@ -180,10 +182,6 @@
180
182
 
181
183
  int iCount = 0; /* 入力した文字数を数える変数 */
182
184
 
183
- int iFlg = 0; /* 不正入力の有無のフラグ(1が不正入力) */
184
-
185
- char cInput = 0; /* 入力した文字を代入される変数 */
186
-
187
185
  char cBuffer[200] = {'\0'}; /* 入力した文字を出力するための配列 */
188
186
 
189
187
 

6

fgetsで2バイト文字が半分に切れてしまった文字を判定し、出力させないようにするにはどうしたらよいでしょうか?

2018/07/30 01:23

投稿

Alyn
Alyn

スコア50

test CHANGED
File without changes
test CHANGED
@@ -170,6 +170,8 @@
170
170
 
171
171
  ### fgetsでのソースコード
172
172
 
173
+ ```C
174
+
173
175
  void main()
174
176
 
175
177
  {
@@ -230,6 +232,8 @@
230
232
 
231
233
  }
232
234
 
235
+ ```
236
+
233
237
  ### 追記2
234
238
 
235
239
  fgetsでこのように作ってみたのですが、このまま「aあああああ」と入力すると「 aああああ・」となってしまいます。

5

fgetsで作成したことによる問題が発生

2018/07/30 01:09

投稿

Alyn
Alyn

スコア50

test CHANGED
File without changes
test CHANGED
@@ -167,3 +167,71 @@
167
167
  ### 追記
168
168
 
169
169
  fgetsやgets_sでは文字以外の不正入力通知やオーバーフローの阻止ができるのでしょうか?
170
+
171
+ ### fgetsでのソースコード
172
+
173
+ void main()
174
+
175
+ {
176
+
177
+ /*--------変数・配列の宣言--------*/
178
+
179
+ int iCount = 0; /* 入力した文字数を数える変数 */
180
+
181
+ int iFlg = 0; /* 不正入力の有無のフラグ(1が不正入力) */
182
+
183
+ char cInput = 0; /* 入力した文字を代入される変数 */
184
+
185
+ char cBuffer[200] = {'\0'}; /* 入力した文字を出力するための配列 */
186
+
187
+
188
+
189
+ printf("1_文字列を入力し、その文字列をそのまま出力します。\n");
190
+
191
+
192
+
193
+ printf("文字列を入力:");
194
+
195
+
196
+
197
+ /*--------文字列の入力--------*/
198
+
199
+ fgets(cBuffer, 11, stdin);
200
+
201
+
202
+
203
+ /*--------NAL文字を配列の最後にする--------*/
204
+
205
+ while(cBuffer[iCount] != 0x00)
206
+
207
+ {
208
+
209
+ if(cBuffer[iCount] == 0x0a)
210
+
211
+ {
212
+
213
+ cBuffer[iCount] = 0x00;
214
+
215
+ putchar('\n'); /* 改行 */
216
+
217
+ break;
218
+
219
+ }
220
+
221
+ iCount++;
222
+
223
+ }
224
+
225
+
226
+
227
+ /*--------文字列の出力--------*/
228
+
229
+ printf("入力した文字列は「 %s 」です。\n", cBuffer); /* 入力した文字列を出力 */
230
+
231
+ }
232
+
233
+ ### 追記2
234
+
235
+ fgetsでこのように作ってみたのですが、このまま「aあああああ」と入力すると「 aああああ・」となってしまいます。
236
+
237
+ この"・"のような2バイト文字が半分に切れてしまった文字を判定し、出力させないようにするにはどうしたらよいでしょうか?

4

2018/07/30 01:08

投稿

Alyn
Alyn

スコア50

test CHANGED
File without changes
test CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
 
4
4
 
5
- _getch()を使用して1~2バイト文字を入力するプログラムを作りたい。
5
+ _getch()を使用してシフトJISの1~2バイト文字を入力するプログラムを作りたい。
6
6
 
7
7
  1バイト文字ならソースコードができていますが、2バイト文字にはどう対応していいのかわかりません。
8
8
 

3

2018/07/24 12:45

投稿

Alyn
Alyn

スコア50

test CHANGED
File without changes
test CHANGED
File without changes

2

2018/07/24 12:44

投稿

Alyn
Alyn

スコア50

test CHANGED
File without changes
test CHANGED
@@ -163,3 +163,7 @@
163
163
  }
164
164
 
165
165
  ```
166
+
167
+ ### 追記
168
+
169
+ fgetsやgets_sでは文字以外の不正入力通知やオーバーフローの阻止ができるのでしょうか?

1

誤字修正

2018/07/24 12:44

投稿

Alyn
Alyn

スコア50

test CHANGED
File without changes
test CHANGED
@@ -26,13 +26,13 @@
26
26
 
27
27
  /*--------変数・配列の宣言--------*/
28
28
 
29
- int iCount = 0; /* 入力した文字数を数える変数 */
29
+ int iCount = 0; /* 入力した文字数を数える変数 */
30
30
 
31
- int iFlg = 0; /* 不正入力の有無のフラグ(1が不正入力) */
31
+ int iFlg = 0; /* 不正入力の有無のフラグ(1が不正入力) */
32
32
 
33
- char cInput = 0; /* 入力した文字を代入される変数 */
33
+ char cInput = 0; /* 入力した文字を代入される変数 */
34
34
 
35
- char cBuffer[200] = {'\0'}; /* 入力した文字を出力するための配列 */
35
+ char cBuffer[200] = {'\0'}; /* 入力した文字を出力するための配列 */
36
36
 
37
37
 
38
38
 
@@ -48,27 +48,27 @@
48
48
 
49
49
  /*--------文字列の入力--------*/
50
50
 
51
- while(cInput != 0x0d) /* ループ条件:cInputがEnterでない間 */
51
+ while(cInput != 0x0d) /* ループ条件:cInputがEnterでない間 */
52
52
 
53
53
  {
54
54
 
55
55
  /*--------1文字ずつ入力--------*/
56
56
 
57
- while(1) /* 無限ループ */
57
+ while(1) /* 無限ループ */
58
58
 
59
59
  {
60
60
 
61
- cInput = _getch(); /* 入力した文字をcInputに代入 */
61
+ cInput = _getch(); /* 入力した文字をcInputに代入 */
62
62
 
63
- if(iCount != 0 || cInput != 0x08) /* 条件:iCountが0でないまたはcInputがBackSpaceでない時 */
63
+ if(iCount != 0 || cInput != 0x08) /* 条件:iCountが0でないまたはcInputがBackSpaceでない時 */
64
64
 
65
65
  {
66
66
 
67
- printf("%c", cInput); /* cInputを出力 */
67
+ printf("%c", cInput); /* cInputを出力 */
68
68
 
69
- iCount++; /* 文字数をカウント */
69
+ iCount++; /* 文字数をカウント */
70
70
 
71
- break; /* ループを抜ける */
71
+ break; /* ループを抜ける */
72
72
 
73
73
  }
74
74
 
@@ -76,69 +76,69 @@
76
76
 
77
77
  /*--------入力した文字の判定--------*/
78
78
 
79
- if( (cInput < 0x08) || ( (0x08 < cInput)&&(cInput < 0x0d) ) /* 条件:cInputがEnter,BackSpaceでない時 */
79
+ if( (cInput < 0x08) || ( (0x08 < cInput)&&(cInput < 0x0d) ) /* 条件:cInputがEnter,BackSpaceでない時 */
80
80
 
81
- || ( (0x0d < cInput)&&(cInput < 0x20) ) || (cInput == 0x7f) ) /* 条件:cInputが0x20~0x7eでない時 */
81
+ || ( (0x0d < cInput)&&(cInput < 0x20) ) || (cInput == 0x7f) ) /* 条件:cInputが0x20~0x7eでない時 */
82
82
 
83
83
  {
84
84
 
85
- printf("\n不正入力です。"); /* 不正入力を通知 */
85
+ printf("\n不正入力です。"); /* 不正入力を通知 */
86
86
 
87
- iFlg = 1; /* iFlgに1を代入 */
87
+ iFlg = 1; /* iFlgに1を代入 */
88
88
 
89
- break; /* ループを抜ける */
89
+ break; /* ループを抜ける */
90
90
 
91
91
  }
92
92
 
93
- else if(cInput == 0x08) /* 条件:cInputがBackSpaceの時 */
93
+ else if(cInput == 0x08) /* 条件:cInputがBackSpaceの時 */
94
94
 
95
95
  {
96
96
 
97
- printf(" %c", cInput); /* 一文字消去 */
97
+ printf(" %c", cInput); /* 一文字消去 */
98
98
 
99
- iCount = iCount - 2; /* iCountを-2する */
99
+ iCount = iCount - 2; /* iCountを-2する */
100
100
 
101
101
  }
102
102
 
103
- else if(iCount == 1 && cInput == 0x0d) /* 条件:iCountが1で、かつcInputがEnterの時 */
103
+ else if(iCount == 1 && cInput == 0x0d) /* 条件:iCountが1で、かつcInputがEnterの時 */
104
104
 
105
105
  {
106
106
 
107
- printf("\n不正入力です。"); /* 不正入力を通知 */
107
+ printf("\n不正入力です。"); /* 不正入力を通知 */
108
108
 
109
- iFlg = 1; /* iFlgに1を代入 */
109
+ iFlg = 1; /* iFlgに1を代入 */
110
110
 
111
- break; /* ループを抜ける */
111
+ break; /* ループを抜ける */
112
112
 
113
113
  }
114
114
 
115
- else if(cInput != 0x0d && iCount > 10) /* 条件:cInputがEnterでない、かつ入力した文字数が100文字を超えた時 */
115
+ else if(cInput != 0x0d && iCount > 10) /* 条件:cInputがEnterでない、かつ入力した文字数が10文字を超えた時 */
116
116
 
117
117
  {
118
118
 
119
- printf("\n不正入力です。"); /* 不正入力を通知 */
119
+ printf("\n不正入力です。"); /* 不正入力を通知 */
120
120
 
121
- iFlg = 1; /* iFlgに1を代入 */
121
+ iFlg = 1; /* iFlgに1を代入 */
122
122
 
123
- break; /* ループを抜ける */
123
+ break; /* ループを抜ける */
124
124
 
125
125
  }
126
126
 
127
127
  /*--------文字を配列に格納--------*/
128
128
 
129
- if(cInput != 0x08 && cInput != 0x0d) /* 条件:cInputがEnter,BackSpaceでない時 */
129
+ if(cInput != 0x08 && cInput != 0x0d) /* 条件:cInputがEnter,BackSpaceでない時 */
130
130
 
131
131
  {
132
132
 
133
- cBuffer[iCount - 1] = cInput; /* Buffer[iCount - 1]にcInputを格納 */
133
+ cBuffer[iCount - 1] = cInput; /* Buffer[iCount - 1]にcInputを格納 */
134
134
 
135
135
  }
136
136
 
137
- else if(cInput == 0x0d) /* 条件:cInputがEnterの時 */
137
+ else if(cInput == 0x0d) /* 条件:cInputがEnterの時 */
138
138
 
139
139
  {
140
140
 
141
- cBuffer[iCount - 1] = '\0'; /* Buffer[iCount - 1]にNUL文字を格納 */
141
+ cBuffer[iCount - 1] = '\0'; /* Buffer[iCount - 1]にNUL文字を格納 */
142
142
 
143
143
  }
144
144
 
@@ -146,15 +146,15 @@
146
146
 
147
147
  }
148
148
 
149
- putchar('\n'); /* 改行 */
149
+ putchar('\n'); /* 改行 */
150
150
 
151
151
  /*--------文字列の出力--------*/
152
152
 
153
- if(iFlg == 0) /* 条件:iFlgが0の時 */
153
+ if(iFlg == 0) /* 条件:iFlgが0の時 */
154
154
 
155
155
  {
156
156
 
157
- printf("入力した文字列は「%s」です。\n", cBuffer); /* 入力した文字列を出力 */
157
+ printf("入力した文字列は「%s」です。\n", cBuffer); /* 入力した文字列を出力 */
158
158
 
159
159
 
160
160