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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
sakana13
記事: 4
登録日時: 2年前

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

#1

投稿記事 by sakana13 » 2年前

引数がポインタ変数のみ与えられた状態から、main関数内の配列要素数を調べる方法がわかりません

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

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

greeting(gre);

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

アバター
幸尚
記事: 47
登録日時: 2年前
連絡を取る:

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

#2

投稿記事 by 幸尚 » 2年前

*helloのポインタを一つずつヌル文字(\0)までチェックして行ってはどうでしょうか?

やり方は色々ありますが、まず、文字列をカウントする変数を一つ用意して*helloのポインタがヌル文字でなければカウンタを一つカウント、*helloのアドレスを一つ進めると言った具合です。
ボールを違うところに投げてたらご指摘して頂けると嬉しいです(o_ _)o

アバター
幸尚
記事: 47
登録日時: 2年前
連絡を取る:

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

#3

投稿記事 by 幸尚 » 2年前

後は、strlen()関数を使うという手もあります。
ボールを違うところに投げてたらご指摘して頂けると嬉しいです(o_ _)o

アバター
usao
記事: 1889
登録日時: 11年前

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

#4

投稿記事 by usao » 2年前

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

sakana13
記事: 4
登録日時: 2年前

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

#5

投稿記事 by sakana13 » 2年前

幸尚 さんが書きました:
2年前
*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関数内を書き換えてみたのですが、ビルドをかけても何も表示されず…
どこに問題があるのでしょうか?

sakana13
記事: 4
登録日時: 2年前

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

#6

投稿記事 by sakana13 » 2年前

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

sakana13
記事: 4
登録日時: 2年前

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

#7

投稿記事 by sakana13 » 2年前

sakana13 さんが書きました:
2年前
引数がポインタ変数のみ与えられた状態から、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で要素数を返したい、というものです
書き方がなっておらず申し訳ありません

アバター
幸尚
記事: 47
登録日時: 2年前
連絡を取る:

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

#8

投稿記事 by 幸尚 » 2年前

コード:

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

コード:

*(str + count);
strではなくhelloではないですか?
あと*(str + count);では値を加算していることになります。
アドレスを進めなくてはなりません。
ボールを違うところに投げてたらご指摘して頂けると嬉しいです(o_ _)o

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

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

#9

投稿記事 by みけCAT » 2年前

ソースコードを提示する際は、BBCodeが有効な(無効にしない)状態で、
BBCodeのcodeタグの開始タグと終了タグの組(開始タグが先)で囲んでいただけると、
見やすくてありがたいです。
幸尚 さんが書きました:
2年前
strではなくhelloではないですか?
あと*(str + count);では値を加算していることになります。
アドレスを進めなくてはなりません。
str を hello に置き換えれば、hello + count でポインタ hello から count 要素進んだ位置を参照し、 *() でその位置の値を読んでいるので、正しいです。
あとは、読んだ値がヌル文字かをチェックするなどの処理があると良さそうですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

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

#10

投稿記事 by みけCAT » 2年前

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

「要素数」ということは、カウントにはヌル文字の分も含めるのでしょうか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

返信

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