こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C++の問題で困っています。

C++の問題で困っています。

今,C++の入門書を読んでその中の演習問題に取り組んでいるのですが、この本には答えがついていないみたいなので、問題で悩んでいます。
お力を貸してください。

問題
「文字列 s に含まれる最も先頭に位置する文字 c へのポインタを返す関数 strchr_ptr を作成せよ。型は
char * strchr_ptr(const char *s, char c);
とする。例えば、文字列 s が "ABSZXYX" で文字 c が 'X' であれば、返却するのは &s[4]である。
なお、文字 c が文字列 s に含まれない場合は NULL を返却すること。

です。
僕はこの問題に対して、以下のように答えました。
ヘッダのインクルードなどは省きます。

char *strchr_ptr(const char *s, char c)
{    
    for(int i = 0; s[i]; i++)
        if(s[i] == c)
            return const_cast<char *>(&s[i]);
    return NULL;
}

int main()
{
    char s[36] = "ABSZXYX";

    cout << strchr_ptr(s, 'X') << "\n";
    cout << &s + 4 << "\n";
}
と書きました。
cout << &s + 4 << "\n";
はこの上の文で導き出したアドレスがあっているか確かめるものです。
ですが、これをコンパイルして実行すると、
-----------------
XYX
0012FFE0
-----------------
となり、関数側のほうはアドレス的な表記をしてくれません・・。
どうにかして、アドレス表記にしようとあれこれ考えたのですが、どうしても出来ませんでした。
どのようにしたらいいのか教えてください。

初歩的な質問ですが、よろしくお願いします。

投稿日時 - 2010-05-09 23:29:10

QNo.5884093

困ってます

質問者が選んだベストアンサー

>     cout << strchr_ptr(s, 'X') << "\n";

cout << static_cast<void*>(strchr_ptr(s, 'X')) << "\n";
としてください。

>     cout << &s + 4 << "\n";

こちらも間違っています。
cout << static_cast<void*>(s + 4) << "\n";
としてください。

投稿日時 - 2010-05-09 23:35:08

お礼

なるほど!
こういう時には char へのポインタだと文字列の表示になってしまうから, どの型にでも対応できる void へのポインタにキャストしてから表示するんですね。

まさかこんな所で void へのポインタへ型キャストするなんて思いもしませんでした・・。
ありがとうございました!

投稿日時 - 2010-05-10 00:12:31

ANo.1

このQ&Aは役に立ちましたか?

9人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

int main()
{
char s[36] = "ABSZXYX";

cout << static_cast<void*>(strchr_ptr(s, 'X')) << "\n";
cout << static_cast<void*>(s + 4) << "\n";
}

投稿日時 - 2010-05-09 23:43:19

お礼

なるほど!
下の方のご回答でも知りましたが、やはりこういうときはvoid型へのポインタに型キャストしてから表示するんですか!

回答ありがとうございました。
下の方とほとんど変わらない説明をしてくださっているのですが、下の方のほうが早かったということで、下の方をベストアンサーに選ばせていただきます。
ごめんなさい。

投稿日時 - 2010-05-10 00:16:59

あなたにオススメの質問