質問失礼します。
const char*の初期化に任意の文字列(入力値や変数)を使いたいのですができません。
下記のように初期化をするつもりでした。
const char* ary[2];
ary[0] = 文字列入力メソッド();
ary[1] = 文字列入力メソッド();
.
.
.
僕の考えだとconst char* ary[5];の時点で初期化が完了していて、
2、3行目で文字列を入れ込もうとする動作になってるから、変更が効かずに失敗すると考えています。
結局のところ対処法がわかりません。どなたか教えていただけないでしょうか?
元はといえば引数にconst char*を要求するメソッドがあって、入力で一度指定した文字列が引数に入ればいいんですけどね…
const char*の初期化に定数以外の入力した文字を使いたい
Re: const char*の初期化に定数以外の入力した文字を使いたい
言語が指定されていないので、とりあえずC言語と仮定します。違うのであれば使用するプログラミング言語を教えてください。
を書いて実験したところ、うまく動いているようです。
「できません」とは具体的にどういうエラーが出るのか、もしくはエラーが出るからではないのならどうしてできないと判断したのか教えてください。
なお、名前や「メソッド」という用語からJavaの可能性も考えられますが、Javaではそもそもそのような文法は無いのでconst char*を用いることはできません。
失礼なのは質問ではなく、フォーラムルールにそっていない意味不明な質問です。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で殴ればいい!(死亡フラグ)
Re: const char*の初期化に定数以外の入力した文字を使いたい
ん?意味がよくわからない。みけCAT さんが書きました: 失礼なのは質問ではなく、フォーラムルールにそっていない意味不明な質問です。
修飾語を取り除くと、
失礼なのは質問ではなく、質問です。
となるのであるが、そうすると、何が失礼に当たるのか、全然わからない。
ちなみに、元の質問がそれほど失礼に当たるとは思いません。自分は。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: const char*の初期化に定数以外の入力した文字を使いたい
ん?意味がよくわからない。box さんが書きました:ん?意味がよくわからない。みけCAT さんが書きました: 失礼なのは質問ではなく、フォーラムルールにそっていない意味不明な質問です。
修飾語を取り除くと、
失礼なのは質問ではなく、質問です。
となるのであるが、そうすると、何が失礼に当たるのか、全然わからない。
boxさんは、例えば「有害なのはラブライバーではなく、マナーを守らないラブライバーである。」という文に対し、「修飾語を取り除くと『有害なのはラブライバーではなく、ラブライバーである』となり、意味がわからない。」と主張するのですか?
もしくは、「error: invalid conversion from 'const char*' to 'char*'」というメッセージに対し、「修飾語を取り除くと『error: invalid conversion from 'char*' to 'char*'』となり、意味がわからない。」と主張するのですか?
もしそうであれば、一貫性があるので、「そういう考え方の人もいるのだなあ」という感想にとどめ、さらなる論争は避けたいと思います。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: const char*の初期化に定数以外の入力した文字を使いたい
「できない」とは,どのような内容なのでしょうか。javaero さんが書きました:const char*の初期化に任意の文字列(入力値や変数)を使いたいのですができません。
下記のように初期化をするつもりでした。
const char* ary[2];
ary[0] = 文字列入力メソッド();
ary[1] = 文字列入力メソッド();
.
.
.
僕の考えだとconst char* ary[5];の時点で初期化が完了していて、
2、3行目で文字列を入れ込もうとする動作になってるから、変更が効かずに失敗すると考えています。
初期化は確かにという宣言兼定義において暗黙で行われています。
# 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*の初期化に定数以外の入力した文字を使いたい
ary が静的変数なら、ary[0] も ary[1] も NULL で初期化されますが、javaero さんが書きました: 僕の考えだとconst char* ary[5];の時点で初期化が完了していて、
2、3行目で文字列を入れ込もうとする動作になってるから、変更が効かずに失敗すると考えています。
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
考えたら、実際に試してみましょう。