web-dev-qa-db-ja.com

文字列Cの個々の文字要素を置き換える

Cで本当に基本的なことを実行しようとしていますが、セグメンテーションエラーが発生し続けます。私がやりたいのは、Wordの文字を別の文字に置き換えることだけです。この例では、lをLに置き換えます。どこが間違っているのかを誰かが説明してもらえますか?それは本当に基本的な問題だと思いますが、なぜそれが機能しないのか分かりません。

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

int main(int argc, char *argv[])
{
    char *string1;

    string1 = "hello";
    printf("string1 %s\n", string1);    

    printf("string1[2] %c\n", string1[2]);
    string1[2] = 'L';
    printf("string1 %s\n", string1);

    return 0;
}

私の出力では、

string1こんにちは
string1 [2] l
セグメンテーション違反

ありがとう!

13
user1163974
string1 = "hello";
string1[2] = 'L';

あなた 文字列リテラルを変更することはできません 、それは未定義の動作です。これを試して:

char string1[] = "hello";

または多分:

char *string1;
string1 = malloc(6); /* hello + 0-terminator */
strcpy(string1, "hello");

/* Stuff. */

free(string1);
16
cnicutar
char *string1;
string1 = "hello";

string1は文字列リテラルを指し、文字列リテラルは変更できません。

あなたができることは、文字列リテラルの要素で配列を初期化することです。

char string1[] =  "hello";

string1配列の要素は変更可能です。

4
ouah
char *string1 = "hello";

コードを実行すると、文字列リテラルは読み取り専用のセクションになります。 OSはコードがそのメモリブロックを変更することを許可しないため、セグメンテーション違反が発生します。

char string1[] = "hello";

コードを実行すると、文字列リテラルがスタックにプッシュされます。

1
Timothy Kwok
 string1[2] = 'L';

cで未定義の動作である文字列リテラルを変更しようとしています。代わりにstring1[]="hello";を使用してください。セグメンテーション違反は、リテラルがメモリの読み取り専用セクションに格納されている可能性があり、それに書き込もうとすると未定義が生成されるためです動作。

0
Bazooka