const char*の初期化に定数以外の入力した文字を使いたい

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

const char*の初期化に定数以外の入力した文字を使いたい

#1

投稿記事 by javaero » 9年前

質問失礼します。
const char*の初期化に任意の文字列(入力値や変数)を使いたいのですができません。
下記のように初期化をするつもりでした。
const char* ary[2];
ary[0] = 文字列入力メソッド();
ary[1] = 文字列入力メソッド();
.
.
.

僕の考えだとconst char* ary[5];の時点で初期化が完了していて、
2、3行目で文字列を入れ込もうとする動作になってるから、変更が効かずに失敗すると考えています。
結局のところ対処法がわかりません。どなたか教えていただけないでしょうか?

元はといえば引数にconst char*を要求するメソッドがあって、入力で一度指定した文字列が引数に入ればいいんですけどね…

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

Re: const char*の初期化に定数以外の入力した文字を使いたい

#2

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

言語が指定されていないので、とりあえずC言語と仮定します。違うのであれば使用するプログラミング言語を教えてください。
javaero さんが書きました:質問失礼します。
失礼なのは質問ではなく、フォーラムルールにそっていない意味不明な質問です。
javaero さんが書きました:const char*の初期化に任意の文字列(入力値や変数)を使いたいのですができません。
下記のように初期化をするつもりでした。
const char* ary[2];
ary[0] = 文字列入力メソッド();
ary[1] = 文字列入力メソッド();
こちらで適当なコード

コード:

#include <stdio.h>
#include <stdlib.h>

const char *string_input_method(void) {
    char* data = malloc(100);
    if (data == NULL) return "";
    data[0] = '\0';
    scanf("%99s", data);
    return data;
}

int main(void) {
    int i;

    const char* ary[2];
    ary[0] = string_input_method();
    ary[1] = string_input_method();

    for (i = 0; i < 2; i++) {
    	printf("ary[%d] = %s\n", i, ary[i]);
    }
    return 0;
}
を書いて実験したところ、うまく動いているようです。
「できません」とは具体的にどういうエラーが出るのか、もしくはエラーが出るからではないのならどうしてできないと判断したのか教えてください。
なお、名前や「メソッド」という用語からJavaの可能性も考えられますが、Javaではそもそもそのような文法は無いのでconst char*を用いることはできません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

box
記事: 2002
登録日時: 14年前

Re: const char*の初期化に定数以外の入力した文字を使いたい

#3

投稿記事 by box » 9年前

みけCAT さんが書きました: 失礼なのは質問ではなく、フォーラムルールにそっていない意味不明な質問です。
ん?意味がよくわからない。
修飾語を取り除くと、
失礼なのは質問ではなく、質問です。
となるのであるが、そうすると、何が失礼に当たるのか、全然わからない。

ちなみに、元の質問がそれほど失礼に当たるとは思いません。自分は。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

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

Re: const char*の初期化に定数以外の入力した文字を使いたい

#4

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

box さんが書きました:
みけCAT さんが書きました: 失礼なのは質問ではなく、フォーラムルールにそっていない意味不明な質問です。
ん?意味がよくわからない。
修飾語を取り除くと、
失礼なのは質問ではなく、質問です。
となるのであるが、そうすると、何が失礼に当たるのか、全然わからない。
ん?意味がよくわからない。
boxさんは、例えば「有害なのはラブライバーではなく、マナーを守らないラブライバーである。」という文に対し、「修飾語を取り除くと『有害なのはラブライバーではなく、ラブライバーである』となり、意味がわからない。」と主張するのですか?
もしくは、「error: invalid conversion from 'const char*' to 'char*'」というメッセージに対し、「修飾語を取り除くと『error: invalid conversion from 'char*' to 'char*'』となり、意味がわからない。」と主張するのですか?
もしそうであれば、一貫性があるので、「そういう考え方の人もいるのだなあ」という感想にとどめ、さらなる論争は避けたいと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

YuO
記事: 947
登録日時: 14年前
住所: 東京都世田谷区

Re: const char*の初期化に定数以外の入力した文字を使いたい

#5

投稿記事 by YuO » 9年前

javaero さんが書きました:const char*の初期化に任意の文字列(入力値や変数)を使いたいのですができません。
下記のように初期化をするつもりでした。
const char* ary[2];
ary[0] = 文字列入力メソッド();
ary[1] = 文字列入力メソッド();
.
.
.

僕の考えだとconst char* ary[5];の時点で初期化が完了していて、
2、3行目で文字列を入れ込もうとする動作になってるから、変更が効かずに失敗すると考えています。
「できない」とは,どのような内容なのでしょうか。

初期化は確かに

コード:

const char* ary[5];
という宣言兼定義において暗黙で行われています。
# Cだと明文での規定はないが (ISO/IEC 9899:2011 6.7.9の第10段落)、C++では明文の規定がある (ISO/IEC 14882:2011 8.5の第11段落)。
しかし,aryは「const char *」の「非constな」配列型なので,ary[0]への代入は可能です。

「文字列入力メソッド」という関数の中身の問題だったりしないでしょうか。
# 関数内で定義した配列へのポインタを返している等。

かずま

Re: const char*の初期化に定数以外の入力した文字を使いたい

#6

投稿記事 by かずま » 9年前

javaero さんが書きました: 僕の考えだとconst char* ary[5];の時点で初期化が完了していて、
2、3行目で文字列を入れ込もうとする動作になってるから、変更が効かずに失敗すると考えています。
ary が静的変数なら、ary[0] も ary[1] も NULL で初期化されますが、
ary が自動変数なら、ary[0] も ary[1] も初期化されません。

const char * で書き込みができないのは const char の部分であって、* ではありません。

ary[0][0] = 'a'; はエラーになります。ary[0][0] は const char だから。
ary[0] = "abc"; はエラーになりません。 ary[0] は * (ポインタ) だから。

char *const ary[5]; ならポインタが書き込み禁止なので、
ary[0] = "abc"; がエラーになります。ary[0] は *const だから。

次の 4つの型の違いが分かりますか?
char *
const char *
char *const
const char *const

考えたら、実際に試してみましょう。

閉鎖

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