ページ 11

文字配列の操作について

Posted: 2010年8月29日(日) 18:43
by 迷彩吹雪
基礎的な事だとは思いますがご教示ください。

以下のプログラムは制作中のゲームの一部を簡略化したものです。
実行するとコメント部分でアクセス違反が発生します。
#include <iostream>

char* TEXT;

void main(){ 

    TEXT = new char[9+1]; //null文字用に+1

    TEXT = "ABCDEFGHI";

    std::cout << TEXT << std::endl;

    std::cout << "0~9までの番号を入力すると該当する文字が「J」になります(したい)" << std::endl;
    int i;
    std::cin >> i;

    TEXT = 'J';    //ここでアクセス違反が発生

    std::cout << TEXT << std::endl;

    delete[/url] TEXT;
    TEXT = 0;

    return;

}


TEXTはchar*型なので文字列の先頭アドレスが格納されている。
TEXTはchar型で文字が格納されている。
そこで代入によってTEXTの文字を書き変え可能だと考えたのですが、上述の通りアクセス違反が出ます。
どのようにすれば文字を書き換えられるのでしょうか。

開発環境:VC++2008EE

Re:文字配列の操作について

Posted: 2010年8月29日(日) 19:01
by h2so5
ヒント:

たとえば配列の一番最初にアクセスしたいとき、

TEXT[(int)'0']

は正しいでしょうか?

Re:文字配列の操作について

Posted: 2010年8月29日(日) 19:15
by 迷彩吹雪
(int)'0'
はchar型からint型へのキャストですよね。
(int)'0' != 0
だと思うので、TEXT[(int)'0'] は間違いだと思います。配列の先頭要素はTEXT[0]ではないかと。

キーボードからの入力はint型変数に代入してもchar型と言うことですか?
しかし
int i;
std::cin >> i;

int i = 3;
などとしてもやはりエラーになります。

Re:文字配列の操作について

Posted: 2010年8月29日(日) 19:18
by めるぽん
TEXT = new char[9+1]; //null文字用に+1
    TEXT = "ABCDEFGHI";
新しく new した配列の中に "ABCDEFGHI" を設定したかったのでしょうけど、これだと TEXT が、全く別の書き込み禁止の領域を指すことになるので、書き込むことが出来ません。
strcpy 等の関数を使ってコピーして下さい。
strcpy(TEXT, "ABCDEFGHI");
# というより文字列リテラルを char* に変換できる仕様がおかしいという気も

Re:文字配列の操作について

Posted: 2010年8月29日(日) 20:30
by 迷彩吹雪
TEXTが定数になってしまうと言うことですね。
以下のように書き直したところ動作しました。
#include <iostream>

char* TEXT;
char String[/url] = "ABCDEFGHI";
const int TEXT_NUM = 9+1; //null文字用に+1

void main(){ 

    TEXT = new char[TEXT_NUM];

    for(int i=0; i<TEXT_NUM; i++){
        TEXT = String;
    }
    std::cout << TEXT << std::endl;

    std::cout << "0~9までの番号を入力すると該当する文字が「J」になります" << std::endl;
    int i;
    std::cin >> i;

    TEXT = 'J';

    std::cout << TEXT << std::endl;

    delete[/url] TEXT;
    TEXT = 0;

    return;

}


同じようにゲーム側のプログラムも書き直したところ、期待通りの動作を確認しました。
strcpy()関数も調べましたが、「処理系によっては動作不能になります」と書いてあるところがあったので怖くなって避けました。

>キーボードからの入力はint型変数に代入してもchar型と言うことですか?
の疑問が残っていますが、本題は片付いたので解決とします。ありがとうございました。

Re:文字配列の操作について

Posted: 2010年8月29日(日) 20:43
by h2so5
std::cinは代入先がintの場合自動で変換されるみたいです。
勘違いしていました。申し訳ありません。

Re:文字配列の操作について

Posted: 2010年8月29日(日) 20:52
by 迷彩吹雪
問題を説明するには不要な入力処理を書いて誤解を招いてしまいました。
解決にご協力して頂き感謝します。