ページ 11

単語出力

Posted: 2009年5月14日(木) 15:50
by 研修生
入力した単語を一行ずつに1つずつ表示するプログラムを組んでいるのですが
わからなくなったのでご質問します。
※単語はスペースで一区切りにしています。
例 abc edf fgだと
abc
edf
fgと出力されます。
int main()
{
  int c;
  char s[1000];
  for(int i = 0; c == '\n'; i++){
    c = getchar()
       if(c== ' ' || c == '\n'){
          s = '\0';
          printf("%s\n", s);
          shokika(s);
       }
       else{
         s = c;
         
       }
  }

   return 0;
}

void shokika(char s[/url])
{
   int len = strlen(s);
   for(int i = 0; i < len; i++){
      s = ' ';
   }
}

また変なプログラムになってしまいましたが・・
aa aaと入力すると最初の方しか入っておらず対処方法がわかりません。
教えて下さい。

Re:単語出力

Posted: 2009年5月14日(木) 15:56
by Mist
> for(int i = 0; c == '\n'; i++){

ソースコードは実行しているものと一致していますか?

cが不定値な上にforの継続条件が「c == '\n'」では相当運がよくないとforに入らないですが。
前回も指摘ありましたがfor文の使い方を再学習されては?

Re:単語出力

Posted: 2009年5月14日(木) 15:58
by 研修生
for(int i = 0; c != '\'n; i++)でした・

Re:単語出力

Posted: 2009年5月14日(木) 16:09
by Mist
s配列を紙に書いて、自分がコンピュータになったつもりでプログラムを一行ずつ読んで配列のデータを書き換えてみることをお勧めします。

ヒントは「s = c;」です。

Re:単語出力

Posted: 2009年5月14日(木) 16:10
by non
shokika(s);
でやりたいことがわからない。
試しに、この行の代わりに、
i=0;って書いたらどうなる?(またはi=-1)

Re:単語出力

Posted: 2009年5月14日(木) 16:33
by 研修生
よくわからないけどa aと入力すると
a
aaと返ってくるからどこかおかしい・・

Re:単語出力

Posted: 2009年5月14日(木) 16:52
by Blue
#include <stdio.h>

int main()
{
    int c;
    while (1)
    {
        c = getchar();
        if (c == EOF || c == '\n') 
        {
            putchar('\n');
            break;
        }
        if (c == ' ') {
            putchar('\n');
        }
        else {
            putchar(c);
        }
    }
    return 0;
}

Re:単語出力

Posted: 2009年5月14日(木) 16:52
by 研修生
ab cdと入力すると
最初
s[0] = 'a';
s[1] = 'b';
s[2] = '\0';

2回目
s[0] = ' ';
s[1] = ' ';
s[2] = ' ';
s[3] = 'c';
s[4] = 'd';

となってるのかな。うーむ

Re:単語出力

Posted: 2009年5月14日(木) 17:36
by non
>よくわからないけどa aと入力すると
>a
>aaと返ってくるからどこかおかしい・・

i=-1;にしたらどうだったの?

Re:単語出力

Posted: 2009年5月14日(木) 18:35
by 研修生
-1だと正しい感じになりますね。

Re:単語出力

Posted: 2009年5月14日(木) 18:40
by non
動けばいいのなら、これで終わりだけど、
結局、次の単語にするときにi=0にする必要があるということです。
で、なんでi=-1なのかというと、forが+1するからですね。
つまり、他の方が言われるように、forの使い方に問題があるわけです。
この問題なら使わない方がわかりやすいです。

Re:単語出力

Posted: 2009年5月14日(木) 20:32
by 初級者
昨日だれかが提示したソースを1箇所だけ修正すればOKです。
応用力の問題。


#include <stdio.h>

enum { NON_BLANK, BLANK, BLANKS };

int main(void)
{
    int c, mode = NON_BLANK;

    while ((c = getchar()) != EOF) {
        if (c != ' ') {
            switch (mode) {
            case BLANK: case BLANKS:
                putchar('\n');
                /* fall thru */
            case NON_BLANK:
                putchar(c);
                mode = NON_BLANK;
                break;
            }
        }
        else {
            switch (mode) {
            case NON_BLANK:
                mode = BLANK;
                break;
            case BLANK: case BLANKS:
                mode = BLANKS;
                break;
            }
        }
    }
    return 0;
}