ページ 11

EOF

Posted: 2009年5月19日(火) 10:02
by 研修生
int main()
{
   int c, lastc = EOF;
   while((c = getchar()) != EOF){
      if(c != ' '){
         putchar(c);
      }
    
 
      else if(lastc !=  ' '){
        putchar(c);  
      }
 
      lastc = c;
   }
   
   return 0;
}
このプログラムは以前質問した2個以上の空白を1つにするというプログラムの解答サンプルですが
判らない所はlastcの初期値のことです。初期値が空白で文字列が○aaのように最初に空白があった場合
その空白は表示されません。また今回は空白が2個以上あった場合 ですが文字列が2個以上あった場合
の一般的な初期値は何にするのが妥当か?という論議がありました。

私としてはも対象の文字以外ならなんでもいいんじゃ・・という意見もだしましたが一般的ではないと
退けられました。結局答えは EOF だったのですが、whileの条件があるからそうかなと思っていましたが
それでもないようです。何故初期値に EOFが良いのか理由わかる方いますか?

Re:EOF

Posted: 2009年5月19日(火) 11:45
by 研修生
自己解決しました

Re:EOF

Posted: 2009年5月19日(火) 11:52
by GPGA
参考までに聞きたいのですが、どのように自己解決しました?

私個人としては、このプログラムはlastcの初期値が' 'のときに正常に動かなくなるので
' '以外であるならば何でもよいと考えます。
従って、初期化は

int lastc = !' ';

とします。

Re:EOF

Posted: 2009年5月19日(火) 13:24
by 研修生
私もそんなもの臨機応変にかえれば・・と思うんですけどね。
今回の論題は空白ではなく文字列であったら?というものでした。
もし2個以上の文字'a'を1つにするとき初期値を'a'とするのはNGです。同様にa~zまで言えます。
すると一般的に定義するのはどれが適当か という論題でした。
結論はEOFが最も適した値でその理由はEOFは0~255以外の値であるから
ということでした。

Re:EOF

Posted: 2009年5月19日(火) 14:47
by たかぎ
> 私もそんなもの臨機応変にかえれば・・と思うんですけどね。

具体的にどんな値にするかはともかく、同様のケースでは常に同じようにコーディングするという一貫性は大切です。

Re:EOF

Posted: 2009年5月19日(火) 17:19
by non
>結論はEOFが最も適した値でその理由はEOFは0~255以外の値であるから
ということでした。

0ではいけないのでしょうか?
私なら lastc = '\0' と書くかもしれない

Re:EOF

Posted: 2009年5月20日(水) 14:52
by GPGA
回答、ありがとうございました。