ページ 11

ポインタを使った表示方法

Posted: 2011年6月05日(日) 17:44
by タマ
ポインタを用いて、数字を入力すると月の名前を表示するプログラムを作っているのですが、うまくいきません。

コード:

#include <stdio.h>

char *month_name(int n){
	static char *months[] = { "January","February","March","April",
		                      "May","June","July","August",
							  "September","October","November","December",
	                          "unknown month"};
	if(n=1) printf("%c",*months[0]);
	else if(n=2) printf("%c",*months[1]);
	else if(n=3) printf("%c",*months[2]);
	else if(n=4) printf("%c",*months[3]);
	else if(n=5) printf("%c",*months[4]);
	else if(n=6) printf("%c",*months[5]);
	else if(n=7) printf("%c",*months[6]);
	else if(n=8) printf("%c",*months[7]);
	else if(n=9) printf("%c",*months[8]);
	else if(n=10) printf("%c",*months[9]);
	else if(n=11) printf("%c",*months[10]);
	else if(n=12) printf("%c",*months[11]);
	else printf("%c",*months[12]);
}

int main(void){
	int n;
	while(scanf("%d",&n)==1){
		month_name(n);
	}
	return 0;
}

char *month_name(int n)とstatic char *months[]の2つの名称は変えないようにしたいですが、どうすればいいでしょうか?

Re: ポインタを使った表示方法

Posted: 2011年6月05日(日) 17:53
by bitter_fox
タマ さんが書きました:ポインタを用いて、数字を入力すると月の名前を表示するプログラムを作っているのですが、うまくいきません。

コード:

char *month_name(int n){
	static char *months[] = { "January","February","March","April",
		                      "May","June","July","August",
							  "September","October","November","December",
	                          "unknown month"};
	if(n=1) printf("%c",*months[0]);
	else if(n=2) printf("%c",*months[1]);
	else if(n=3) printf("%c",*months[2]);
	else if(n=4) printf("%c",*months[3]);
	else if(n=5) printf("%c",*months[4]);
	else if(n=6) printf("%c",*months[5]);
	else if(n=7) printf("%c",*months[6]);
	else if(n=8) printf("%c",*months[7]);
	else if(n=9) printf("%c",*months[8]);
	else if(n=10) printf("%c",*months[9]);
	else if(n=11) printf("%c",*months[10]);
	else if(n=12) printf("%c",*months[11]);
	else printf("%c",*months[12]);
}
これだとイニシャルの一字しか表示されないのではないですか?
文字列を表示する場合は
printf("%s", 文字列の先頭アドレス);
とします。

また、このifの列挙を見るとmonthsの添え字がn-1に対応していることに気が付きます。
さらに、nの値の範囲が(1 <= n <= 12)でない時にmonths[12]が表示されることにも気が付きます。
これらより、もうちょっとスマートに書けるのでそれにも挑戦してみてください。

あと、これは戻り値として文字列(月の名前)の先頭アドレスを返すことが望まれてるのではないでしょうか・・・?

[hr][追記]
また、ただ「うまくいきません」と言うのではなく、どういったところがうまくいかないのかを具体的にしていただくと回答しやすいので次からはそうしてください。(詳しくはフォーラムルールをお読みください。)

Re: ポインタを使った表示方法

Posted: 2011年6月05日(日) 17:58
by h2so5
if文の比較演算子をもう一度確認して下さい。
n=1 という式は正しいですか?

さらに言うと、こんなに大量のif文を使う必要はあるのでしょうか。
もっと簡潔に書けると思いますよ。

Re: ポインタを使った表示方法

Posted: 2011年6月05日(日) 18:05
by タマ

コード:

char *month_name(int n){
	static char *months[] = { "January","February","March","April",
		                      "May","June","July","August",
							  "September","October","November","December",
	                          "unknown month"};
	if(1<=n&&n<=12) printf("%c\n",*months[n-1]);
	else printf("%c\n",*months[12]);
}
month_name内を整理してみました。
ですが、月の名前を""内全体で表示したいのに頭文字しか出てこないので
そこで悩んでいます。
*month_nameと*months[]は変えないように言われています。

Re: ポインタを使った表示方法

Posted: 2011年6月05日(日) 18:07
by h2so5
タマ さんが書きました: ですが、月の名前を""内全体で表示したいのに頭文字しか出てこないので
そこで悩んでいます。
bitter_fox さんの投稿をよく読みましたか?

Re: ポインタを使った表示方法

Posted: 2011年6月05日(日) 18:31
by タマ

コード:

#include <stdio.h>

char *month_name(int n){
	static char *months[] = { "January","February","March","April",
		                      "May","June","July","August",
							  "September","October","November","December",
	                          "unknown month"};
	if(1<=n&&n<=12) printf("%s\n",months[n-1]);
	else printf("%s\n",months[12]);
}

int main(void){
	int n;
	while(scanf("%d",&n)==1){
		month_name(n);
	}
	return 0;
}
もう一度読んでみたらうまく表示できるよう解決できました。
読解力が足りなくて申し訳ないです。

Re: ポインタを使った表示方法

Posted: 2011年6月05日(日) 18:37
by hidden
char *month_name関数の戻り値が結局無いようですが大丈夫ですか?