masa_beginner
@masa_beginner

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

C言語 文字列の初期化

解決したいこと

C言語で
const char* strに
{'A','B','C','D','\0','A','B'} という文字配列を代入したいのですが何か方法はあるでしょうか?
用途としては、memchrを自作していて、終端文字以降もメモリブロックの中身が一致しているかを確かめるために、終端文字以降にも

下記のソースコードのように代入してもうまくいきません。
どなたたか方法をご存知の方がいればご教示ください。

また、なぜ下記のパターン1〜4の代入方法がエラーとなるのでしょうか?

該当するソースコード

int main(void){

//パターン1 エラーとなる
const char* str = "ABCD";
str[4] = '\0';
str[5] = 'A';
str[5] = 'B';

//パターン2 これもエラーとなる
const char* str = "ABCD";
str + 4 = '\0';
str + 5 = 'A';
str + 6 = 'B';

//パターン3 これもエラーとなる
const char* str = "ABCD";
*(str + 4) = '\0';
*(str + 5) = 'A';
*(str + 6) = 'B';

//パターン4 これもエラーとなる
const char* str[7] = {'A','B','C','D','\0','A','B'} ;

return 0;
}

0

3Answer

const修飾子してるので代入できないように見えます。
あと、先に文字列だけ作って最後に0x00代入した方が楽じゃないかな?
って思いました。

#include <stdio.h>

int main()
{
    char str[7] = "abcddab";
    // char *str = (char *)"abcddab"; こっちだとなんかabortしてる。。
    printf("%s\n", str);
    *(str + 4) = 0x00;
    puts(str);
    puts(str + 5);

    return 0;
}
0Like

なぜ下記のパターン1〜4の代入方法がエラーとなるのでしょうか?

エラーメッセージのとおりです。
1,3は
error: read-only variable is not assignable
すなわちconst修飾子がついているのに書き換えようとしているのでエラーになっています。
ちなみにconstを外してもそれはそれで範囲外アクセスの問題があります。

2は
expression is not assignable
これはちょっと何を言われているのかわかりにくいかと思いますが、
str + 4のような式はデータの保管先を示す式ではないにも関わらず、代入の左辺に来ているのでエラーになっています

4はエラーではなく警告で、
warning: incompatible integer to pointer conversion initializing 'const char *' with an expression of type 'int'

これは左辺と右辺の型が合ってないぞと言われてます。

どなたたか方法をご存知の方がいればご教示ください。

const char str[7] = {'A','B','C','D','\0','A','B'};
0Like

Your answer might help someone💌