初期化

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
研修生

初期化

#1

投稿記事 by 研修生 » 16年前

空白を数えるプログラムを作りました
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:初期化

#2

投稿記事 by 初級者 » 16年前

1回打ち込むたび、というのは、
Enter キーを押すたび、ということですか?

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

dic

Re:初期化

#3

投稿記事 by dic » 16年前

#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:初期化

#4

投稿記事 by 研修生 » 16年前

そんな手があったとは気が付きませんでした。
できましたありがとうございました。

初級者

Re:初期化

#5

投稿記事 by 初級者 » 16年前

main関数の型がvoidというのは、
ありなのでしょうか。

研修生

Re:初期化

#6

投稿記事 by 研修生 » 16年前

一応動いてますが、気になるようでしたらintにすればいいのでは

dic

Re:初期化

#7

投稿記事 by dic » 16年前

私はコマンドラインでパイプライン処理などを行わないので
main関数はほとんどvoid型です

Mist

Re:初期化

#8

投稿記事 by Mist » 16年前

Windowsのコマンドラインはmain関数の戻り値を無視するから、戻り値を参照するバッチファイルなどを組まなければ問題ありませんが、ISO-C/ANSI-Cではmain関数は

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

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

toyo

Re:初期化

#9

投稿記事 by toyo » 16年前

私はvoid main( )と書いてある本やサイトは信用しないことにしています
http://www.kouno.jp/home/c_faq/c11.html#15

hss12

Re:初期化

#10

投稿記事 by hss12 » 16年前

ANSI-Cを持ち出されると間違いになってしまいますが、
別のプログラムの関数にするときにvoid型とすぐに分かりますし
return 0;も省略できますし。
エラーにならないなら柔軟に書いても良いと思いますけどね。

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

閉鎖

“C言語何でも質問掲示板” へ戻る