****プログラミング初心者です。
プログラミング言語C(K&R)の演習1-18の解答例を見たのですが、わからないです。
(http://www.c-program-example.com/2011/11/k-r-c-exercise-1-18.html)
関数 get_line と char_remove のしくみを教えて頂けるとありがたいです!
特に
関数 char_remove で配列の中の文字が
’\n’ ' ' '\t'
のときにどうして、i の値をを +1 にしたり、-1
するのかがよくわかりません。
プログラミング言語C(K&R) P38第一章 演習1-18
「各入力行から、行の後のタブやブランクを取り除き、かつ空白行はすべて削除するようなプログラムを書け。」
...c
#include <stdio.h>
#define MAXLINE 1000 /* 入力行の最大長*/
int get_lines(char line[], int maxline); /* 関数 get_lines の宣言 /
int char_remove(char str[]); / 関数 char_removeの宣言 */
main()
{
char line[MAXLINE];/* current input line
: 現在の入力行*/
while((get_lines(line,MAXLINE)) > 0) if (char_remove(line) > 0) printf("%s",line); return 0;
}
/*
remove: trailing blanks and tabs from character string str
文字列から ついていく? タブや空白
*/
int char_remove(char str[])
{
int i = 0; /* i の初期値は 0*/
while (str[i] != '\n') /* 文字が '\n'以外なら*/
++i;/i = i + 1/
--i; /* 文字が'\n'なら、i = i -1*/ while (i >= 0 && (str[i] == ' '|| str[i] == '\t'))/*i が0以上 かつ 文字が空白 あるいは タブなら*/ --i;/* i = i -1*/ if (i >= 0)/*i が0以上なら(文字は空白あるいはタブではない)*/ { ++i;/*i = i + 1*/ str[i] = '\n';/* str[i] に '\n' を代入*/ ++i; str[i] = '\0';/* str[i]に'\0'を代入*/ } return i;/*i の値を返す*/
}
/* getline: read a line into str, return length /
/ str に行を入れて、長さを返す */
int get_lines(char str[], int line)
{
int c,i,j;
for (i = 0, j = 0; (c = getchar()) != EOF && c != '\n'; ++i) /*i ,jの初期値は0.とってきた文字がファイルの終わりではない かつ '\n'でなければ*/ { if (i < line - 1) /*i が 999よりも小さければ */ { str[j++] = c;/*str[j = j +1] に c を代入*/ } } if (c == '\n') /*とってきた文字が '\n'なら*/ { if (i <= line -1) /*iが998以下なら*/ { str[j++] = c; } ++i; } str[j] = '\0';/*str[j]に'\0'を代入*/ return i;/*iの値を返す */
}
コマンドプロンプトで
a.exe < hello.c
と実行すると
#include <stdio.h>
main()
{
printf("hello,");
printf("world");
printf("\n");
}
でした。

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/02/28 03:53
2015/02/28 05:10
2015/02/28 05:12
2015/02/28 06:13
2015/02/28 07:24
2015/02/28 20:31