ページ 11

初期化

Posted: 2009年5月08日(金) 15:47
by 研修生
空白を数えるプログラムを作りました
main()
{
   int c, n1;
   n1 = 0;
   while(( c = getchar()) != EOF){
     if(c == ' '){
         ++n1;
         printf("%d\n", n1);
     }
   }
  
}
としました。これはどんどん空白をカウントしていきます
1回打ち込む度n1をリセットしたいのですがが望む形は空白を1個、2個、4個をそれぞれ入力すると
1
2
4
と出力する形です。今だと
1
3
7になります。
printfの↓で初期化をいれると
1
1
1
になってしまいます。
whileループの後で入れるとループが終わらないらしくそこまでいきません。

どのようにすればうまく初期化できますか?

Re:初期化

Posted: 2009年5月08日(金) 16:05
by 初級者
1回打ち込むたび、というのは、
Enter キーを押すたび、ということですか?

であれば、'\n' を検知するたびに
カウンターをリセットすればよいでしょう。

Re:初期化

Posted: 2009年5月08日(金) 16:14
by dic
#include <stdio.h>
#include <string.h>

void	main()
{
	int n1;
	char c[100];
	n1 = 0;
	while(( gets(c)) ){
		int	i;
		for( i=0; i<strlen(c); i++ )
		{
			if( c == ' ' )
			{
				++n1;
				printf("%d\n", n1);
			}
		}
		n1 = 0;
	}
}

ではいかがでしょうか?

Re:初期化

Posted: 2009年5月08日(金) 16:15
by 研修生
そんな手があったとは気が付きませんでした。
できましたありがとうございました。

Re:初期化

Posted: 2009年5月08日(金) 16:30
by 初級者
main関数の型がvoidというのは、
ありなのでしょうか。

Re:初期化

Posted: 2009年5月08日(金) 16:45
by 研修生
一応動いてますが、気になるようでしたらintにすればいいのでは

Re:初期化

Posted: 2009年5月08日(金) 16:56
by dic
私はコマンドラインでパイプライン処理などを行わないので
main関数はほとんどvoid型です

Re:初期化

Posted: 2009年5月08日(金) 17:12
by Mist
Windowsのコマンドラインはmain関数の戻り値を無視するから、戻り値を参照するバッチファイルなどを組まなければ問題ありませんが、ISO-C/ANSI-Cではmain関数は

int main(void)
または
int main(int argc, char *argv[/url])
int main(int argc, char **argv)

と決められているのでvoidにはしないほうがいいです。

Re:初期化

Posted: 2009年5月08日(金) 17:26
by toyo
私はvoid main( )と書いてある本やサイトは信用しないことにしています
http://www.kouno.jp/home/c_faq/c11.html#15

Re:初期化

Posted: 2009年5月09日(土) 04:57
by hss12
ANSI-Cを持ち出されると間違いになってしまいますが、
別のプログラムの関数にするときにvoid型とすぐに分かりますし
return 0;も省略できますし。
エラーにならないなら柔軟に書いても良いと思いますけどね。

入門書でなんの説明もなしにいきなりvoid main()になっているのはどうかと思いますが。
規格を知らずに書いているのなら、ほかの部分も知らずに書いているのだろうから
信用できないというのは同意できますね。