teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

追加

2020/07/30 08:48

投稿

amiya
amiya

スコア1218

answer CHANGED
@@ -5,4 +5,45 @@
5
5
  文字数とは限りません。
6
6
 
7
7
  fgetsは改行まで含めてしまうので、その分を減らすか、始めから複数行を前提で、「改行まで」の文字数を検知したいのであれば、
8
- `strchr(test,'\n')-test` 等として求めてください(これもバイト数です)
8
+ `strchr(test,'\n')-test` 等として求めてください(これもバイト数です)
9
+
10
+
11
+ 今の状態だと、入力内容次第で問題が起きそうなので…こんな感じ?
12
+
13
+ ```C
14
+ #include <stdio.h>
15
+ #include <string.h>
16
+
17
+ #define MAXDATA 256
18
+
19
+ int main(void) {
20
+ char test[MAXDATA];
21
+ char flag = 0;
22
+
23
+ while (flag == 0) {
24
+ puts("何か文字を入力して、エンターキーを押してください");
25
+ printf(">>");
26
+ // 半角全角10文字以内を想定
27
+ fgets(test,MAXDATA,stdin);
28
+
29
+ char *p = strchr(test, '\n'); // 改行位置を取得
30
+ if (p != NULL){ // 改行があった場合
31
+ *p = '\0';       // 改行位置で文字列を終了させる
32
+ } else { //ついでにMAXDATAオーバーの処理
33
+ // 範囲を超えて入力された場合のオーバーラン対策
34
+ while (fgetc(stdin) != '\n');
35
+ }
36
+
37
+ int len = strlen(test); // 改めて長さを取得
38
+ if (len <= 30) { // 一文字3Byte固定なら30?
39
+ printf("%d\n", len);
40
+ printf("10文字以下で、%sと入力されました",test);
41
+ flag = 1;
42
+ }
43
+ }
44
+
45
+ return 0;
46
+ }
47
+ ```
48
+
49
+ scanfとかsscanfを使った方が手っ取り早い気がする。

1

追加

2020/07/30 08:48

投稿

amiya
amiya

スコア1218

answer CHANGED
@@ -2,4 +2,7 @@
2
2
  その返り値と文字数制限を比較してください。
3
3
 
4
4
  ただし、正確にはこれで分かるのはバイト数であり、1文字が2バイト以上の文字コードを使った場合には、
5
- 文字数とは限りません。
5
+ 文字数とは限りません。
6
+
7
+ fgetsは改行まで含めてしまうので、その分を減らすか、始めから複数行を前提で、「改行まで」の文字数を検知したいのであれば、
8
+ `strchr(test,'\n')-test` 等として求めてください(これもバイト数です)