C言語関係掲示板

過去ログ

No792 getcharで単語の登録

[戻る] [ホームページ]
No.9893

文字入力について
投稿者---mormor(2003/10/20 01:27:42)


どうもです!
えぇ〜っと。このwhile文の中なんですが、getcharがどのように処理されてtangoの中に格納されているか全くわかりません...
これで正しくは実行できるのですが、その処理自体の流れやどのようになっているかが知りたいです!!
誰かわかる方お願いします!!!!!!
環境はWindowsです。
以下ソースを記述します

#include <stdio.h>
#include <ctype.h>
#define OFF 0
#define ON 1

main()
{
	char c,tango[30][41];
	int i,j,k,flag;
	i=0;
	j=0;
	while((c=getchar())!=EOF)
	{
		if(isalpha(c))
		{
			tango[i][j]=c;
			j++;
			flag=ON;
			putchar(c );
		}
		else if(flag==ON)
		{
			tango[i][j]='\0';
			flag=OFF;
			j=0;
			i++;
		}
	}
	if(flag==0)
	{
		tango[i][j]='\0';
		i++;
	}
	printf("\n作り出した単語数%3d個",i);
	for(k=0;k<i;k++)
		printf("\n   単語%2d番目:%s",k+1,tango[k]);
}


No.9895

Re:文字入力について
投稿者---mormor(2003/10/20 01:45:08)


すみません!
あと何故最後にtango[k]で単語が表示されるのかも
わかりません...
申し訳ありませんがよろしくお願いします。

No.9896

Re:文字入力について
投稿者---ともじ(2003/10/20 09:36:35)


>えぇ〜っと。このwhile文の中なんですが、getcharがどのように処理されて
>tangoの中に格納されているか全くわかりません...

コメントを入れてみました。これでいかがでしょう。
最初からCtrl+Zが押下されることも考えると、flagの初期化が必要なので、
少しソースを修正しました。

#include <stdio.h>
#include <ctype.h>
#define OFF 0
#define ON 1

int main()
{
        char c,tango[30][41];
        int i,j,k,flag=OFF;
        i=0;
        j=0;
        while((c=getchar())!=EOF)       /* Ctrl+Zが入力されるまで一文字入力 */
        {
                if(isalpha(c))          /* 英字なら */
                {
                        tango[i][j]=c;  /* 単語を配列に格納 */
                        j++;
                        flag=ON;
                        putchar(c );    /* Enterキー押下のタイミングで表示 */
                }
                else if(flag==ON)       /* 英字の後に英字以外の入力があったら */
                {
                        tango[i][j]='\0'; /* '\0'を付加し、単語の終了とする */
                        flag=OFF;
                        j=0;
                        i++;            /* 次の単語の登録のために添え字を更新 */
                }
        }
        if(flag==ON)    /* 途中でCtrl+Zが押下されたら、'\0'が付加されないので */
        {
                tango[i][j]='\0';       /* '\0'を付加し、単語の終了とする */
                i++;                    /* 単語の登録数を数えるために添え字を更新 */
        }
        printf("\n作り出した単語数%3d個",i);
        for(k=0;k<i;k++)
                printf("\n   単語%2d番目:%s",k+1,tango[k]);

        return 0;
}

putchar(c );    /* Enterキー押下のタイミングで表示 */
というのは、Enterキーが押下されまでキー入力は入力バッファに溜められ、
Enterキー押下で入力バッファがフラッシュされ、内容が表示されるからです。

>あと何故最後にtango[k]で単語が表示されるのかも
>わかりません...

http://www9.plala.or.jp/sgwr-t/c/sec09.html#s9-1-4
をご参照ください。