ページ 11

ポインタを用いた配列要素数の調べ方

Posted: 2022年11月18日(金) 17:08
by sakana13
引数がポインタ変数のみ与えられた状態から、main関数内の配列要素数を調べる方法がわかりません

例として、
________________________________
void greeting(char * hello)
{
}

int main(void)
{
char gre[] = "Hello World";

greeting(gre);

return;
}
________________________________
このような状態の時、どうしたらいいのでしょうか?
あくまでgreeting関数内で調べなくてはいけないので、引数を増やすというのは無しでお願いします。

Re: ポインタを用いた配列要素数の調べ方

Posted: 2022年11月18日(金) 17:17
by 幸尚
*helloのポインタを一つずつヌル文字(\0)までチェックして行ってはどうでしょうか?

やり方は色々ありますが、まず、文字列をカウントする変数を一つ用意して*helloのポインタがヌル文字でなければカウンタを一つカウント、*helloのアドレスを一つ進めると言った具合です。

Re: ポインタを用いた配列要素数の調べ方

Posted: 2022年11月18日(金) 17:23
by 幸尚
後は、strlen()関数を使うという手もあります。

Re: ポインタを用いた配列要素数の調べ方

Posted: 2022年11月18日(金) 17:50
by usao
オフトピック
タイトルが「配列」という広い言葉になっているけど,対象は「ヌル文字で終端された文字列(charの配列)」である,という前提で良いのかな?
(そうでない,一般的な「配列」の話なのだとしたら無理だと思う)

Re: ポインタを用いた配列要素数の調べ方

Posted: 2022年11月18日(金) 18:03
by sakana13
幸尚 さんが書きました:
1年前
*helloのポインタを一つずつヌル文字(\0)までチェックして行ってはどうでしょうか?

やり方は色々ありますが、まず、文字列をカウントする変数を一つ用意して*helloのポインタがヌル文字でなければカウンタを一つカウント、*helloのアドレスを一つ進めると言った具合です。
ご回答ありがとうございます。

________________________________
int greeting(char * hello)
{
int count = 0;
int len;  //要素数

while(hello != '¥0')
{
count++;
*(str + count);
}

len = count;
return len;

}

int main(void)
{
char gre[] = "Hello World";

printf("%d",greeting(gre));

return;
}
________________________________

greeting関数内を書き換えてみたのですが、ビルドをかけても何も表示されず…
どこに問題があるのでしょうか?

Re: ポインタを用いた配列要素数の調べ方

Posted: 2022年11月18日(金) 18:06
by sakana13
usao さんが書きました:
1年前
オフトピック
タイトルが「配列」という広い言葉になっているけど,対象は「ヌル文字で終端された文字列(charの配列)」である,という前提で良いのかな?
(そうでない,一般的な「配列」の話なのだとしたら無理だと思う)
ご回答ありがとうございます
「ヌル文字で終端された文字列」で合っています!
情報が足りず申し訳ありません;

Re: ポインタを用いた配列要素数の調べ方

Posted: 2022年11月18日(金) 18:10
by sakana13
sakana13 さんが書きました:
1年前
引数がポインタ変数のみ与えられた状態から、main関数内の配列要素数を調べる方法がわかりません

例として、
________________________________
int greeting(char * hello)
{
int len;
〜要素数を調べる処理〜
return len;
}

int main(void)
{
char gre[] = "Hello World";

printf("%d",greeting(gre));

return;
}
________________________________
このような状態の時、どうしたらいいのでしょうか?
あくまでgreeting関数内で調べなくてはいけないので、引数を増やすというのは無しでお願いします。
※追記
greeting関数の戻り値がvoidになっていますがint型の間違いです
正確にはreturnで要素数を返したい、というものです
書き方がなっておらず申し訳ありません

Re: ポインタを用いた配列要素数の調べ方

Posted: 2022年11月18日(金) 18:58
by 幸尚

コード:

while(hello != '¥0')
ここはアドレスをヌル文字でチェックしています。

コード:

*(str + count);
strではなくhelloではないですか?
あと*(str + count);では値を加算していることになります。
アドレスを進めなくてはなりません。

Re: ポインタを用いた配列要素数の調べ方

Posted: 2022年11月19日(土) 04:00
by みけCAT
ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
幸尚 さんが書きました:
1年前
strではなくhelloではないですか?
あと*(str + count);では値を加算していることになります。
アドレスを進めなくてはなりません。
str を hello に置き換えれば、hello + count でポインタ hello から count 要素進んだ位置を参照し、 *() でその位置の値を読んでいるので、正しいです。
あとは、読んだ値がヌル文字かをチェックするなどの処理があると良さそうですね。

Re: ポインタを用いた配列要素数の調べ方

Posted: 2022年11月19日(土) 04:03
by みけCAT
さらに、「helloからcount要素進んだ位置の値を読んでチェックする」処理の前に「countの値を増やす」処理を置いてしまうと、0文字の文字列 (最初の要素がヌル文字) が与えられた時にヌル文字を見逃してしまうので、よくないですね。

「要素数」ということは、カウントにはヌル文字の分も含めるのでしょうか?