文字配列の操作について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
迷彩吹雪

文字配列の操作について

#1

投稿記事 by 迷彩吹雪 » 15年前

基礎的な事だとは思いますがご教示ください。

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

h2so5

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

#2

投稿記事 by h2so5 » 15年前

ヒント:

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

TEXT[(int)'0']

は正しいでしょうか?

迷彩吹雪

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

#3

投稿記事 by 迷彩吹雪 » 15年前

(int)'0'
はchar型からint型へのキャストですよね。
(int)'0' != 0
だと思うので、TEXT[(int)'0'] は間違いだと思います。配列の先頭要素はTEXT[0]ではないかと。

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

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

めるぽん

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

#4

投稿記事 by めるぽん » 15年前

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

迷彩吹雪

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

#5

投稿記事 by 迷彩吹雪 » 15年前

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型と言うことですか?
の疑問が残っていますが、本題は片付いたので解決とします。ありがとうございました。

h2so5

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

#6

投稿記事 by h2so5 » 15年前

std::cinは代入先がintの場合自動で変換されるみたいです。
勘違いしていました。申し訳ありません。

迷彩吹雪

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

#7

投稿記事 by 迷彩吹雪 » 15年前

問題を説明するには不要な入力処理を書いて誤解を招いてしまいました。
解決にご協力して頂き感謝します。

閉鎖

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