2017-07-06 106 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。 – 2017-07-06 21:28:11

回答

1

不能修改字符串字面。事實上,你可以嘗試,但這是未定義的行爲它可能會或可能無法正常工作。

取而代之,首先將字符串放入變量中,然後使用它。在這種情況下,當調用main並將其置於堆棧時,將初始化您的字符串,因此您可以稍後進行修改。

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

字符串文字必須用作不可修改的字符串。當試圖修改這樣的字符串時,我們有未定義的行爲

+0

我不明白,我有一個字符數組。在該字符數組的索引0處,我嘗試將元素設置爲'a',但它不起作用。爲什麼?至於你究竟想要引用什麼字符串,是不是一個字符數組? – PssstZzz

+1

因爲你使用* string literal *而不是RAM中的字符串。 *字符串文字*可以放在無法修改的部分。 @PssstZzz – tilz0R

+0

@PssstZzz這是一個不可修改的字符數組。字符串文字是那些。 – bipll