私のプロジェクトには、const char*
のみを返すメソッドがありますが、APIはchar*
を受け入れないため、const char*
文字列が必要です。
const char*
からchar*
に変換する方法はありますか?
安全のために、(たとえば、これらの文字列がコード内で変更された場合など)を壊したり、プログラムをクラッシュさせたりしない(返される文字列が"hello I'm a literal string"
などのリテラルで、編集を開始する場合)それ)、返された文字列のコピーを作成します。
これにはstrdup()
を使用できますが、 small print を読んでください。または、プラットフォームにない場合はもちろん、独自のバージョンを作成できます。
そして、疑問が残ります。なぜchar*
が必要なのですか、const char*
で動作するようにコードを変更できないのですか?
まず第一に、本当に必要な場合にのみそのようなことをすべきです-例えば。変更されていないchar*
引数を持つ古いスタイルのAPIを使用する。 API関数が元々constであった文字列を変更する場合、これは不特定の動作であり、クラッシュする可能性が非常に高くなります。
キャストを使用:
(char*)const_char_ptr
次のプロトタイプを持つstrdup
関数を使用できます
char *strdup(const char *s1);
使用例:
#include <string.h>
char * my_str = strdup("My string literal!");
char * my_other_str = strdup(some_const_str);
またはバッファにstrcpy/strncpy
または、可能であればconst char *
の代わりにchar *
をパラメーターとして使用するように関数を書き直して、const
を保存できるようにします
ポインターへのconst
は、「読み取り専用」メモリー位置を示します。一方、const
のないものは読み書き可能なメモリ領域です。したがって、const
(読み取り専用の場所)を通常の(読み取り/書き込み)の場所に「変換」できません。
別の方法は、データを別の読み取り/書き込み場所にコピーし、このポインターを必要な関数に渡すことです。このアクションを実行するには、strdup()
を使用できます。
(char *)Identifier_Of_Const_char
を実行することでキャストできます
しかし、おそらくapiがconst cahr *
を受け入れない理由があるので、これを行うべきです。確かな場合、関数はconst char*
の範囲内の値を割り当てようとしません。非constにキャストしました。
const char*
をchar*
に変換するには、次のような関数を作成できます。
#include <stdio.h>
char* unconstchar(const char* s) {
int i;
char* res;
for (i = 0; s[i] != '\0'; i++) {
res[i] = s[i];
}
res[i] = '\0';
return res;
}
int main() {
const char* s = "hi this is bikash\n";
char* p = unconstchar(s);
printf("%s",p);
}