2017-07-06 14 views
1

Javaから来たC言語の新機能です。この理由だけで私を説明:C++文字配列内の要素を変更できない

text[0] = 'a';

ができない、私のプログラムだけでクラッシュします。

#include "caesarHead.h" 
 
#include <limits.h> 
 

 
int main(void) { 
 

 
\t caesar("Hello this is a sample text", 12); 
 

 
\t printf("\n\n"); 
 
} 
 

 

 
void caesar(char text[], char offset) { 
 
\t int i = 0; 
 
\t text[0] = 'a'; 
 
\t char *p = text; 
 

 
\t for (p; *p != '\0'; p++) { \t 
 
\t \t \t 
 
\t \t printf("String: %c \n", text[i]); 
 
\t \t printf("Ascii: %i \n", (int)text[i]); 
 
\t \t i++; 
 
\t } 
 
}

+1

"私はC言語に新しい" - spoなぜあなたのタイトルとタグは "C++"と言うのですか? – Olaf

+0

Cタグまたはstd :: stringを使用するか、コンパイラがすでにstd :: string_viewをサポートしている場合。 –

答えて

1

あなたはリテラル文字列を変更することはできません。実際に試すことができますが、これはの未定義の動作であり、動作しているかどうかは関係ありません。

代わりに、文字列を変数に入れてから使用してください。この場合、文字列はmainが呼び出されたときに初期化され、スタックに置かれますので、後で変更することができます。

int main(void) { 
    char str[] = "Hello this is a sample text"; 
    caesar(str, 12); 
    printf("\n\n"); 
} 

リテラル文字列を非修正文字列として使用する必要があります。このような文字列を変更しようとすると、という未定義の動作があります。

+0

私はそれを取得しない、私はchar配列を持っています。その文字配列のインデックス0で、私は 'a'に要素を設定しようとし、それは動作しません。どうして ?そして、まさにStringとして参照しようとしているのは、char配列ではありませんか? – PssstZzz

+1

RAMからの文字列ではなく*文字列リテラル*を使用したためです。 *文字列リテラル*は、変更できないセクションに置くことができます。 @PssstZzz – tilz0R

+0

@PssstZzzこれは変更不可能なchar配列です。文字列リテラルはそれらです。 – bipll

関連する問題