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

質問編集履歴

2

コメントを追加しました

2015/02/28 03:52

投稿

senbe
senbe

スコア27

title CHANGED
File without changes
body CHANGED
@@ -1,8 +1,14 @@
1
- プログラミング初心者です。
1
+ ****プログラミング初心者です。
2
2
  プログラミング言語C(K&R)の演習1-18の解答例を見たのですが、わからないです。
3
3
  (http://www.c-program-example.com/2011/11/k-r-c-exercise-1-18.html)
4
4
  関数 get_line と char_remove のしくみを教えて頂けるとありがたいです!
5
5
 
6
+ 特に
7
+ 関数 char_remove で配列の中の文字が
8
+ ’\n’ ' ' '\t'
9
+ のときにどうして、i の値をを +1 にしたり、-1
10
+ するのかがよくわかりません。
11
+
6
12
  プログラミング言語C(K&R) P38第一章 演習1-18
7
13
  「各入力行から、行の後のタブやブランクを取り除き、かつ空白行はすべて削除するようなプログラムを書け。」
8
14
 

1

コメントを追加しました

2015/02/28 03:52

投稿

senbe
senbe

スコア27

title CHANGED
File without changes
body CHANGED
@@ -7,11 +7,12 @@
7
7
  「各入力行から、行の後のタブやブランクを取り除き、かつ空白行はすべて削除するようなプログラムを書け。」
8
8
 
9
9
  ...c
10
+
10
11
  #include <stdio.h>
11
- #define MAXLINE 1000
12
+ #define MAXLINE 1000 /* 入力行の最大長*/
12
13
 
13
- int get_lines(char line[], int maxline);
14
+ int get_lines(char line[], int maxline); /* 関数 get_lines の宣言 */
14
- int char_remove(char str[]);
15
+ int char_remove(char str[]); /* 関数 char_removeの宣言 */
15
16
 
16
17
  main()
17
18
  {
@@ -20,7 +21,7 @@
20
21
 
21
22
  while((get_lines(line,MAXLINE)) > 0)
22
23
  if (char_remove(line) > 0)
23
- printf("%s",line);
24
+ printf("%s",line);
24
25
  return 0;
25
26
  }
26
27
  /*
@@ -30,22 +31,23 @@
30
31
 
31
32
  int char_remove(char str[])
32
33
  {
33
- int i = 0;
34
+ int i = 0; /* i の初期値は 0*/
34
- while (str[i] != '\n')
35
+ while (str[i] != '\n') /* 文字が '\n'以外なら*/
35
- ++i;
36
+ ++i;/*i = i + 1*/
36
37
 
37
- --i;
38
+ --i; /* 文字が'\n'なら、i = i -1*/
38
39
 
39
- while (i >= 0 && (str[i] == ' '|| str[i] == '\t'))
40
+ while (i >= 0 && (str[i] == ' '|| str[i] == '\t'))/*i が0以上 かつ
40
- --i;
41
- if (i >= 0)
41
+ 文字が空白 あるいは タブなら*/
42
+ --i;/* i = i -1*/
43
+ if (i >= 0)/*i が0以上なら(文字は空白あるいはタブではない)*/
42
44
  {
45
+ ++i;/*i = i + 1*/
46
+ str[i] = '\n';/* str[i] に '\n' を代入*/
43
47
  ++i;
44
- str[i] = '\n';
45
- ++i;
46
- str[i] = '\0';
48
+ str[i] = '\0';/* str[i]に'\0'を代入*/
47
49
  }
48
- return i;
50
+ return i;/*i の値を返す*/
49
51
  }
50
52
  /* getline: read a line into str, return length */
51
53
  /* str に行を入れて、長さを返す */
@@ -54,26 +56,28 @@
54
56
  int c,i,j;
55
57
 
56
58
  for (i = 0, j = 0; (c = getchar()) != EOF && c != '\n'; ++i)
59
+ /*i ,jの初期値は0.とってきた文字がファイルの終わりではない かつ '\n'でなければ*/
57
60
  {
58
- if (i < line - 1)
61
+ if (i < line - 1) /*i が 999よりも小さければ */
59
62
  {
60
- str[j++] = c;
63
+ str[j++] = c;/*str[j = j +1] に c を代入*/
61
64
  }
62
65
  }
63
- if (c == '\n')
66
+ if (c == '\n') /*とってきた文字が '\n'なら*/
64
67
  {
65
- if (i <= line -1)
68
+ if (i <= line -1) /*iが998以下なら*/
66
69
  {
67
70
  str[j++] = c;
68
71
  }
69
72
  ++i;
70
73
  }
74
+ str[j] = '\0';/*str[j]に'\0'を代入*/
71
- str[j] = '\0';
75
+ return i;/*iの値を返す */
72
- return i;
73
76
  }
77
+
74
78
  コマンドプロンプトで
75
- >a.exe<hello.c
79
+ >a.exe < hello.c
76
- hello.c をリダイレクトすると
80
+ 実行すると
77
81
 
78
82
  #include <stdio.h>
79
83
  main()