ページ 11

ポインタのポインタについて

Posted: 2007年7月26日(木) 21:12
by けるびん
また、ポインタのポインタを使った問題なんですが。


コマンドラインで -a<数字> が与えられたら,"good morning" を<数字>回表示し, -h<数字> が与えられたら,"good afternoon" を<数字>回表示し, -y<数字> が与えられたら,"good night" を<数字>回表示するプログラムを作成せよ.

(実行例)
$ ./a.out -a1
good morning
$ ./a.out -a1 -h2
good morning
good afternoon
good afternoon
$ ./a.out -a1 -h2 -y3
good morning
good afternoon
good afternoon
good night
good night
good night

問題は以上です。

入力数字が1桁なら、ちゃんとその回数分出力するんですが、2桁以上となると最上位の桁の数字しか読み込んでくれず、200と入力すると2回分しか文字が表示されないんです。
原因はポインタのポインタが数字の部分の先頭アドレスしか読んでないからだと思うんですが、改善策をプログラム化できなくて困っています。
2桁以上の入力にも対応できるようにするには、どのようにすればいいでしょうか。
御願いします。

Re:ポインタのポインタについて

Posted: 2007年7月26日(木) 21:35
by box
ちょっとした例です。よかったら解析してみてください。

なお、97, 104, 121のような、特定のコード体系に依存する数値を
直接書かない方がよいと思います。
'a', 'h', 'y'と書く方がわかりやすいと思いませんか?
#include <stdio.h>
#include <stdlib.h>

typedef struct _message {
	char timezone;
	char *greeting;
} MESSAGE;

int main(int argc, char **argv)
{
	MESSAGE msg[/url] = {
		{ 'a', "good morning" },
		{ 'h', "good afternoon" },
		{ 'y', "good night" },
	};
	int i, j, n;
	char opt;
	
	while (--argc) {							/* コマンドライン引数がある間 */
		opt = **(++argv);						/* 各引数の先頭文字 */
		if (opt == '-') {						/* '-'で始まるのが有効 */
			opt = *++(*argv);					/* '-'の次の文字 */
			for (i = 0; i < sizeof(msg) / sizeof(msg[0]); i++) {
				if (opt == msg.timezone) {	/* 時間帯として有効な文字なら */
					n = atoi(++(*argv));		/* 後に続く文字列を数値化する */
					for (j = 0; j < n; j++)
						printf("%s\n", msg.greeting);	/* 挨拶の出力 */
				}
			}
		}
	}
	return 0;
}

Re:ポインタのポインタについて

Posted: 2007年7月26日(木) 22:20
by けるびん
プログラムが見やすくて、助かります。
自分は、プログラムの流れがつかめていなかったようです
コメントまで付けてくださりありがとうございました。
sizeof演算子には少し疎いので、もう少し、勉強しようと思います。
しかし、こんな短い行数でできるとは思ってませんでした。

このプログラムを見て自分で作ってみたんですが、
完全に我流にしてしまい、教えていただいたのに申し訳ないです。
本当に参考にしたの??っていうくらいなんで。

本当にありがとうございましたm(_ _)m

Re:ポインタのポインタについて(今更質問なんですが)

Posted: 2007年7月27日(金) 00:08
by けるびん
for (i = 0; i < sizeof(msg) / sizeof(msg[0]); i++) {
if (opt == msg.timezone) {/* 時間帯として有効な文字なら */
n = atoi(++(*argv));/* 後に続く文字列を数値化する */
}

まず、分からないところは

for(i = 0; i < sizeof(msg) / sizeof(msg[0]); i++)

のところの i < sizeof(msg) / sizeof(msg[0]); でiをどういう考えの範囲まで回そうとしているのか。

もうひとつは if文内の"時間帯として有効な文字なら"の意味がよく分からないです。

お礼を言った後なんですが、よろしく御願いします。

Re:ポインタのポインタについて(今更質問なんですが)

Posted: 2007年7月27日(金) 00:30
by tk-xleader
>sizeof(msg) / sizeof(msg[0]);

配列msgの大きさじゃないでしょうか。sizeof(msg)で配列全体のバイト数を求めて、
sizeof(msg[0])で配列の最初の要素(は必ずあるので)のバイト数を求め、割り算すれば、
配列の大きさが求まりますので。

Re:ポインタのポインタについて(今更質問なんですが)

Posted: 2007年7月27日(金) 01:33
by けるびん
またまたお礼です。

この問題に関して・・・
修行してきます。

回答ありがとうございました。