入力されたキーを調べる方法

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

入力されたキーを調べる方法

#1

投稿記事 by 新人 » 17年前

始めまして。C言語を始めて約1ヶ月の初心者です。
問1 ファイルを作成するプログラムを作成してください。
 1:ファイル名作成を促すメッセージを画面に出力し、キーボードからの入力を行う。
 2:1文字以上入力された場合、「1:」で入力した名前でファイルを作成する。
 3:ファイル名の作成が完了した胸を画面に出力する。

というものなんですが、仕様書に
「文字入力後、リターンキーを押した場合」
 1:現在のディレクトリに入力した文字と同じ名前のファイルがあることを確認。
 2:ファイル作成完了のメッセージが画面に出力されることを確認。

「文字入力せずに、リターンキーを押した場合」
 1:ファイルが作成されないことを確認
と書かれていてエビデンスを行う際に、ファイルが作成されないことの確認
が出来なくて困っています。(エンターを押しても、証拠が出ないので困ってます)

かなり分かりにくい文ですが、よろしくお願いします。

バグ

Re:課題が出来なくて困っています

#2

投稿記事 by バグ » 17年前

strlen関数で文字列の長さを調べて、0だったらファイルを作成しなかったというメッセージを出力してはどうでしょうか?

管理人

Re:課題が出来なくて困っています

#3

投稿記事 by 管理人 » 17年前

エビデンスって言葉初めてききました・・。

もしプログラムをもうお書きの場合はそれを見せてもらったらどこが

おかしいのか判ると思います。

getcharで入力キーを調べているのでしたら、

1回目に読み取った文字が\nだったら、何も入力されずに

エンターが入力されたことがわかります。


ファイル出力はこの辺が参考になるかもしれません。

http://always-pg.com/c/runtime_rd/file/fputs.html

新人

Re:課題が出来なくて困っています

#4

投稿記事 by 新人 » 17年前

さっそくのレスありがとうございます。
#include<stdio.h>
int main()
{
	FILE *fp;
	char fname[64];

	printf("ファイルを作成して下さい。\n");
	scanf("%s",fname);

	fp=fopen(fname,"w");
	if(fp==NULL){
	printf("ファイルが作成出来ません。\n");
	fclose(fp);
  }
	return 0;
}
一応こんな感じなんですが、どこがいけないのでしょうか?
まだ知識不足で皆様からのアドバイスをいただいても中々
実践出来なくて申し訳ないです。

管理人

Re:課題が出来なくて困っています

#5

投稿記事 by 管理人 » 17年前

これは入力を受けた変数に何が入っているかどこにも判定している箇所がありません。

fp==NULL

はなにを判定しているか。
これは入力を受けたキーの調査をしているわけではありません。
先ほどのリンクを参考にしてください。

scanfで取り込んだデータの調査方法は先ほど書いたので参考にしてみてください。

新人

Re:課題が出来なくて困っています

#6

投稿記事 by 新人 » 17年前

すみません。無知の極みで管理人さんのおっしゃってる意味が
わかりません。

とりあえず明日までに完成させないといけないので、もう少し
具体的に教えていただけないでしょうか?お忙しい中、本当に
すみません。

管理人

Re:課題が出来なくて困っています

#7

投稿記事 by 管理人 » 17年前

#include<stdio.h>
void main() 
{ 
	int i=0;
	char fname[64]; 
	
	while(fname=getchar() != '\n')
		i++;

	if(i==0)
		printf("何も入力されずにエンター押されました。");
}


これがエンターが押された時、何か入力があったかどうか判定するプログラムです。

これは入力を受けるプログラムと、判定するプログラムが合体しています。

getcharで入力を受けた1文字ずつをfnameに格納していき、それが\nなら
エンターによる改行だとわかります。
最初からループにはいらないということは、
最初に\nが来たということなのでなにも入力がなかったということですね。

新人

Re:課題が出来なくて困っています

#8

投稿記事 by 新人 » 17年前

ありがとうございます。上記ソースの意味は理解できたのですが、
このソースを私が記入したソースのどこに当てはめればいいのでしょうか?

質問ばかりで申し訳ありません。課題が出来たら、管理人さの解説を元に
確実に理解したいと思っています。

管理人

Re:課題が出来なくて困っています

#9

投稿記事 by 管理人 » 17年前

この意味がわかったのでしたら、課題は必ずできます。

答えばかりを追い求めるのではなく、アリゴリズムを確認してください。
#include<stdio.h>
void main() 
{ 
	int i=0;//カウントするための変数
	char fname[64]; //ファイル名入力を受けるための変数
	
	while(1){//無限ループ
		fname=getchar();//キー入力から1文字を受け取る
		if(fname == '\n')//受け取った文字が改行コードなら
			break;//ループを抜ける。
		else//受け取った文字が改行コード以外なら
			i++;//次の文字を格納するためにカウントアップ
	}

	if(i==0)//最初に改行文字が入力されていたら何も入力されなかったということ
		printf("何も入力されずにエンター押されました。");
}


これと

#include<stdio.h> 
int main() 
{ 
	FILE *fp; 
	char fname[64]; 

	printf("ファイルを作成して下さい。\n"); 
	scanf("%s",fname); //ファイル名を格納する配列に文字列を格納

	fp=fopen(fname,"w"); //ファイルを書き込みモードで開く。ファイルの情報があるアドレスをfpに格納

	if(fp==NULL){ //格納したアドレスが無効なら
		printf("ファイルが作成出来ません。\n"); 
		return 1;
 	} 
	fclose(fp); //fpを閉じる
	return 0; 
}


これですね。
役割が重複している箇所がありますね。
何の行が何の役割をしているか、考えて、うまくあてはめてみてください。

管理人

Re:課題が出来なくて困っています

#10

投稿記事 by 管理人 » 17年前

getchar関数の仕組みがよくわからなければ、こちらをコンパイルしてみてください。
#include<stdio.h>
void main() 
{ 
	int i=0,j;
	char fname[64]; 
	
	while(1){
		fname=getchar();
		printf("%c\n",fname);
		if(fname == '\n')
			break;
		else
			i++;
	}	
}


getchar関数は、キーボード入力から1文字を受け取る関数です。

sampleと入力してエンターを押すとします。

最初getchar関数を呼ぶと「s」が返ってきます。
次にgetchar関数を呼ぶと「a」が返ってきます。
次にgetchar関数を呼ぶと「m」が返ってきます。
次にgetchar関数を呼ぶと「p」が返ってきます。
次にgetchar関数を呼ぶと「l」が返ってきます。
次にgetchar関数を呼ぶと「e」が返ってきます。
次にgetchar関数を呼ぶと「\n」が返ってきます。(これは見えません)
\nは改行を表すコードです。

getchar関数を何度もよぶことで、1つずつ格納が出来るんです。
配列に順番に格納したければ、iをカウントしていって、指定すればいいですね。

i=0の状態で、getcharの返り値をfnameに格納する。
すると
fname[0]にが格納されます。

i=1の状態で、getcharの返り値をfnameに格納する。
すると
fname[1]に[a]が格納されます。

i=2の状態で、getcharの返り値をfnameに格納する。
すると
fname[2]に[m]が格納されます。

i=3の状態で、getcharの返り値をfnameに格納する。
すると
fname[3]に[p]が格納されます。

i=4の状態で、getcharの返り値をfnameに格納する。
すると
fname[4]に[[/url]が格納されます。

\nが帰ってくればループを抜けたらいいんです。

最初に\nが帰ってくるなら何も入力されていないことがわかります。

管理人

Re:課題が出来なくて困っています

#11

投稿記事 by 管理人 » 17年前

わかりました?







と書かれたプログラムと




と書かれたプログラムがあり、

の部分に


を代入すれば







という完成したプログラムが出来上がるという状態です。

新人

Re:課題が出来なくて困っています

#12

投稿記事 by 新人 » 17年前

とても丁寧な解説ありがとうございました。
また分からないことがあったら質問するかもしれません。
その際はよろしくお願いします。

管理人

Re:課題が出来なくて困っています

#13

投稿記事 by 管理人 » 17年前

はい、頑張ってくださいね。

閉鎖

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