P38演習1-18 各入力行から、行の後のブランクやタブを取り除き、かつ空白行は全て削除するようなプログラムを書け。において、
(1)デバッグ時に\n(文末)がフと表示されてしまいます。
This is a pen.[空白orタブ][エンター(改行)]
と入力すると、
This is a pen.フ
修正箇所を教えていただけないでしょうか。
(2)『文字列配列の末尾に\0を挿入する』ためのif文内の条件が考え付かず、35行目に
if(newline == '\n')
と妥協案として書いてるのですが適切な条件を教えていただけないでしょうか。
(3)line[]内の空白タブを削除されたものをnewline[]に後ろから格納する際、
line[10]に空白があるとしてnewline[10]には何も格納されないわけですが、
newline[10]には『何も格納されていない』のか『\0で埋まる』のかどちらでしょうか。
環境はvisual studio 2010です。
/* 全ての行から末尾のブランクやタブを削除、空白行を削除 */
#include <stdio.h>
#define MAXLINE 1000
#define IN 1
#define OUT 0
#define START 2 /* statusをIN or OUTで初期化すると最初の\nの処理に失敗するので */
main(){
int i, c;
int status; /* INで文の中、OUTで文の外 */
char line[MAXLINE];
char newline[MAXLINE]; /* 空白など削除後にline[]からこの配列に移し、こいつを出力 */
printf("文章を入力してください。\n");
printf("全ての行から末尾のブランクやタブを削除され、空白行も削除されます。\n");
for(i=0; (c = getchar()) != EOF; i++)
line[i] = c;
status = START;
for(i=MAXLINE; i >= 0; --i){
if(line[i] == '\n' && status != OUT){ /* statusが IN or START なら\nを格納 */
status = OUT;
newline[i] = '\n';
}
else if(line[i] != '\n' && line[i] != ' ' && line[i] != '\t')
status = IN;
if(status == IN)
newline[i] = line[i];
}
for(i=MAXLINE; i >= 0; --i){ /* 配列の末尾に\0を挿入 */
if(newline[i] == '\n'){
newline[i+1] = '\0';
break;
}
}
printf("%s\n", newline);
return 0;
}