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

回答編集履歴

2

改行数の処理を追加

2020/01/07 17:46

投稿

jimbe
jimbe

スコア13355

answer CHANGED
@@ -45,15 +45,16 @@
45
45
  return ch;
46
46
  }
47
47
  int main(int argc, char *argv[]) {
48
- FILE *fp; /* 入力ファイル用ファイルポインタ */
48
+ FILE *fp; /* 入力ファイル用ファイルポインタ */
49
- int ch; /* 入力文字 */
49
+ int ch; /* 入力文字 */
50
- int line=0; /*行数*/
50
+ int line=0; /*行数*/
51
- int word=0; /*単語数*/
51
+ int word=0; /*単語数*/
52
- int character=0; /*文字数*/
52
+ int character=0; /*文字数*/
53
- int comment=0; /*コメント数*/
53
+ int comment=0; /*コメント数*/
54
- int comment_chars=0; /*コメント文字数*/
54
+ int comment_chars=0; /*コメント文字数*/
55
+ int comment_lines=0; /*コメント改行数*/
55
- int whitespace=TRUE;/*空白文字を読んでいる最中は真(単語を読んでいる間,偽)*/
56
+ int whitespace=TRUE;/*空白文字を読んでいる最中は真(単語を読んでいる間,偽)*/
56
- int back;
57
+ int back;
57
58
 
58
59
  if(argc == 1) {
59
60
  fp=stdin; /*標準入力を入力ファイルとする*/
@@ -88,6 +89,16 @@
88
89
  back=ch;
89
90
  }
90
91
  comment++;
92
+ while((ch = getSJIS(fp)) != EOF) {
93
+ if(ch=='\n') {
94
+ comment_lines++;
95
+ break;
96
+ }
97
+ if(ch!=' ' && ch!='\t') {
98
+ ungetc(ch,fp);
99
+ break;
100
+ }
101
+ }
91
102
  continue;
92
103
  }
93
104
  ungetc(ch,fp);
@@ -114,10 +125,9 @@
114
125
  character++;
115
126
  }
116
127
  }
117
- printf("行数=%d 単語数=%d(%d) 文字数=%d(%d)\n",
128
+ printf("行数=%d(%d) 単語数=%d(%d) 文字数=%d(%d)\n",
118
- line, word, word+comment, character, character+comment_chars);
129
+ line, line+comment_lines, word, word+comment, character, character+comment_chars);
119
130
  fclose(fp);
120
131
  exit(0);
121
132
  }
122
-
123
133
  ```

1

コード追加

2020/01/07 17:46

投稿

jimbe
jimbe

スコア13355

answer CHANGED
@@ -1,4 +1,123 @@
1
1
  > 出力結果はコメントもカウントしてしまいます
2
2
 
3
3
  "/*" の初めの "/" がカウントされてしまっているのではないでしょうか.
4
- "/" を読んだ時点でカウントを遅延させる(次が "*" で無かったら "/" の分もカウントする)等, の細工が必要なのではないでしょうか.
4
+ "/" を読んだ時点でカウントを遅延させる(次が "*" で無かったら "/" の分もカウントする)等, の細工が必要なのではないでしょうか.
5
+
6
+ ---
7
+ 追加
8
+
9
+ 文字コード SJIS(MS932) として修正してみました.
10
+ 結果表示の()内がコメントを含む場合のカウントです.
11
+ ```c
12
+ #include <stdio.h>
13
+ #include <stdlib.h>
14
+ #define TRUE 1
15
+ #define FALSE 0
16
+
17
+ int isSpace(int c) {
18
+ return c==' '||c=='\n'||c=='\t';
19
+ }
20
+ int isSJIS1(int c) {
21
+ return ((c>=0x81)&&(c<=0x9f))||((c>=0xe0)&&(c<=0xfc));
22
+ }
23
+ /*
24
+ * getc に
25
+ * ・SJIS全角も1文字として返す
26
+ * ・改行コード(\n,\r,\r\n)を'\n'に統一する
27
+ * 機能を追加
28
+ */
29
+ int getSJIS(FILE *fp) {
30
+ int ch, c;
31
+ if((ch = getc(fp)) != EOF) {
32
+ if(isSJIS1(ch)) {
33
+ if((c = getc(fp)) != EOF) {
34
+ ch=(ch<<8)|(c&0xff);
35
+ }
36
+ } else if(ch=='\r') {
37
+ ch='\n';
38
+ if((c = getc(fp)) != EOF) {
39
+ if(c!='\n') {
40
+ ungetc(c,fp);
41
+ }
42
+ }
43
+ }
44
+ }
45
+ return ch;
46
+ }
47
+ int main(int argc, char *argv[]) {
48
+ FILE *fp; /* 入力ファイル用ファイルポインタ */
49
+ int ch; /* 入力文字 */
50
+ int line=0; /*行数*/
51
+ int word=0; /*単語数*/
52
+ int character=0; /*文字数*/
53
+ int comment=0; /*コメント数*/
54
+ int comment_chars=0; /*コメント文字数*/
55
+ int whitespace=TRUE;/*空白文字を読んでいる最中は真(単語を読んでいる間,偽)*/
56
+ int back;
57
+
58
+ if(argc == 1) {
59
+ fp=stdin; /*標準入力を入力ファイルとする*/
60
+ } else if(argc == 2) {
61
+ /*指定したファイルを開く*/
62
+ if((fp=fopen(argv[1],"r"))== NULL) {
63
+ fprintf(stderr,"%s:ファイルが開けませんでした%s\n", argv[0],argv[1]);
64
+ exit(1);
65
+ }
66
+ }
67
+
68
+ /*EOF が現れるまで 1 文字ずつ読みとる*/
69
+ while((ch = getSJIS(fp)) != EOF) {
70
+ // printf("standerd back=%c ch=%c\n",back,ch);
71
+ /* '/''*'の文字かどうか判定する*/
72
+ if(ch=='/') {
73
+ if((ch = getSJIS(fp)) != EOF) {
74
+ if(ch=='*') {
75
+ comment_chars+=2;
76
+ /* '/''*'の場合はEOFまで1文字ずつ読み取る*/
77
+ back = 0;
78
+ while((ch = getSJIS(fp)) != EOF) {
79
+ if(!isSpace(ch)) {
80
+ comment_chars++;
81
+ }
82
+ //printf("innet back=%c ch=%c\n",back,ch);
83
+ /*一文字ずつ読み取り'*''/'を読み取ったらループを抜ける*/
84
+ if(back=='*' && ch=='/') {
85
+ break;
86
+ }
87
+ /*一文字前に読み取った文字を代入する*/
88
+ back=ch;
89
+ }
90
+ comment++;
91
+ continue;
92
+ }
93
+ ungetc(ch,fp);
94
+ }
95
+ ch = '/';
96
+ }
97
+
98
+ /*改行なら行数を増やす*/
99
+ if(ch=='\n') {
100
+ line++;
101
+ }
102
+ /*空白、改行、タブの場合は空白とする。*/
103
+ if(isSpace(ch)) {
104
+ whitespace = TRUE;
105
+ }
106
+ /*空白の場合は単語を増やす*/
107
+ else if(whitespace) {
108
+ whitespace = FALSE;
109
+ /*単語数を増やす*/
110
+ word++;
111
+ }
112
+ if(!whitespace) {
113
+ /*文字数を増やす*/
114
+ character++;
115
+ }
116
+ }
117
+ printf("行数=%d 単語数=%d(%d) 文字数=%d(%d)\n",
118
+ line, word, word+comment, character, character+comment_chars);
119
+ fclose(fp);
120
+ exit(0);
121
+ }
122
+
123
+ ```