ページ 11

ポインタ

Posted: 2009年4月23日(木) 17:49
by 研修生
文字列のポインタを3つ進めてから2文字分だけ取りだすプログラムです。
int main()
{
  char *p="VisualC++";
  char *q;
  
   for(int i=0;i<3;i++){
     *p++;
   }
   
   for(i=3;i<5;i++){
     *q++=*p++;
   }
 
   cout<<q;
   return 0;
}

としたのですが、プログラムに問題が発生しましたとでます。どこが悪いのかはわかっていますが
どうすればいいのかがわかりません。教えて下さい。

Re:ポインタ

Posted: 2009年4月23日(木) 18:03
by 初級者
どこに問題があるかおわかりとのことですが、
具体的にはどこですか?

Re:ポインタ

Posted: 2009年4月23日(木) 18:22
by 研修生
for(i=3;i<5;i++){
*q++=*p++;←ここです
}
デバッグでここで止まりました。

Re:ポインタ

Posted: 2009年4月23日(木) 18:31
by ouh
デバッグでとまるのはそこかもしれませんが、まず直さないとだめなのは
char *q;
です。

それを直したうえでの話ですが、
*p++;
じゃなくて
p++;
としないと。

そもそもfor文使わなくても
p += 3;
だけでいいです。

Re:ポインタ

Posted: 2009年4月23日(木) 18:34
by Mist
No:32578はqは実体をもたないポインタだからダメです。
実体を定義してそのアドレスをqにセットしてください。

提示のプログラムには他に問題あるからこれだけ直しても駄目だけどね。

Re:ポインタ

Posted: 2009年4月23日(木) 18:41
by 研修生
ですね。char *qがおかしいから←でとまります。
原因がわかりません

Re:ポインタ

Posted: 2009年4月23日(木) 18:48
by ouh
>ですね。char *qがおかしいから←でとまります。
>原因がわかりません

それについてはMistさんが回答してくださっているんですが、
答えを言ってしまうと、
char q[3];
としてあとのコードを考えるといいと思います。

Re:ポインタ

Posted: 2009年4月23日(木) 18:51
by 研修生
あ、すいません。その回答を見たのは書き込み後でしたので。

Re:ポインタ

Posted: 2009年4月23日(木) 19:07
by Mist
> ouhさん

> *p++;
> じゃなくて
> p++;
> としないと。

一応言っておくとこの部分は間違いではないです。
*を付ける必要がないのはその通りですが

*p++



*p;
p++;

を短縮しただけなので、ポインタは研修生さんの意図通りに進んでいます。

Re:ポインタ

Posted: 2009年4月23日(木) 19:13
by 研修生
なんか難しいですね。

Re:ポインタ

Posted: 2009年4月23日(木) 19:13
by ouh
> Mistさん
ご指摘ありがとうございます。おっしゃる通りですね。浅はかでした。

> 研修生さん
すみません。*p++; でも研修生さんの意図した結果になります。
でも p++; と書きましょう。

Re:ポインタ

Posted: 2009年4月23日(木) 22:01
by 草なぎ剛容疑者
こんな風にしたかったのでしょうか。

#include <iostream>

using namespace std;

int main(void)
{
    char *p = "VisualC++";

    p += 3, cout << *p;
    p++, cout << *p;
    return 0;
}

Re:ポインタ

Posted: 2009年4月25日(土) 22:59
by Naohiro19
このプログラムのデバッグ結果です。:
>Run-Time Check Failure #3 - The variable 'q' is being used without being defined.
>test.exe の 0x00416d95 でハンドルされていない例外が発生しました : 0xC0000005: 場所 0xcccccccc に書き込み中にアクセス違反が発生しました。 。