web-dev-qa-db-ja.com

Cでconst char *をchar *に変換する方法は?

私のプロジェクトには、const char*のみを返すメソッドがありますが、APIはchar*を受け入れないため、const char*文字列が必要です。

const char*からchar*に変換する方法はありますか?

44
Morpheus

安全のために、(たとえば、これらの文字列がコード内で変更された場合など)を壊したり、プログラムをクラッシュさせたりしない(返される文字列が"hello I'm a literal string"などのリテラルで、編集を開始する場合)それ)、返された文字列のコピーを作成します。

これにはstrdup()を使用できますが、 small print を読んでください。または、プラットフォームにない場合はもちろん、独自のバージョンを作成できます。

そして、疑問が残ります。なぜchar*が必要なのですか、const char*で動作するようにコードを変更できないのですか?

21
meaning-matters

まず第一に、本当に必要な場合にのみそのようなことをすべきです-例えば。変更されていないchar*引数を持つ古いスタイルのAPIを使用する。 API関数が元々constであった文字列を変更する場合、これは不特定の動作であり、クラッシュする可能性が非常に高くなります。

キャストを使用:

(char*)const_char_ptr
42
Wojtek Surowka

次のプロトタイプを持つ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を保存できるようにします

19
j123b567

ポインターへのconstは、「読み取り専用」メモリー位置を示します。一方、constのないものは読み書き可能なメモリ領域です。したがって、const(読み取り専用の場所)を通常の(読み取り/書き込み)の場所に「変換」できません。

別の方法は、データを別の読み取り/書き込み場所にコピーし、このポインターを必要な関数に渡すことです。このアクションを実行するには、strdup()を使用できます。

5
raghav3276

(char *)Identifier_Of_Const_charを実行することでキャストできます

しかし、おそらくapiがconst cahr *を受け入れない理由があるので、これを行うべきです。確かな場合、関数はconst char*の範囲内の値を割り当てようとしません。非constにキャストしました。

0
dhein

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);
}
0
Bikash