2012-01-22 67 views
1

在我的代碼有編譯器警告時的char *設置爲字符串字面

char* s = strchr(first,'/'); 
if(s==NULL) s = ""; 
else s = s+1; 

但我的gcc編譯器抱怨在與

warning: assignment discards qualifiers from pointer target type 

倒數第二行從我的理解有關ANSI C,它是因爲我將s(非const值)設置爲字符串文本(const值)。 (我在這裏錯了嗎?)但是我需要s是非const的(因爲我可能會通過加1來改變它的值),並且我還需要將s設置爲空字符串。我有沒有更好的代碼設計方法來實現這兩個目標,而不需要編譯器大喊大叫?

我確實啓用了-Wwrite-strings標誌。

+0

這真的很難說。如何更多的代碼?你想做什麼?你只是想指出它在別的地方,或者你想修改strchr返回的字符串? – Mario

+0

你打算對空串做什麼修改? –

+0

'然而,我需要非常量'爲什麼? – Chris

回答

0

您應該使用strcpy而不是分配字符串文字。問題是字符串文字是常量,並且s將包含該字符串的地址,而不是字符串本身,這是不好的。

例如,如果您有:

char str[100]; 
str = "Hello world"; 

的100字符的分配將與"Hello world"常量字符串的地址來代替地址。

使字符串爲空的最簡單方法是將第一個值設置爲NULL(*s = NULL);

+0

您不能將字符串文字分配給數組。 'char str [100] =「Hello world」;'很好,但是'char str [100]; str =「你好世界」;'不是。 – kennytm

+0

@KennyTM這就是我試圖解釋的,這是不正確的,因爲你試圖分配一個不同的地址的str指針 – Tibi

+0

這不是地址,但不兼容的類型。指針不能分配給數組。 – kennytm

1

您是否需要s而不是const,或者您是否需要s來解決常量存儲問題?有很大的不同。在前一種情況下,您可以簡單地投射到char*。在後一種情況下,您必須使用malloc來存儲所需的存儲空間(或將的地址指定爲char[]的適當範圍值)。

3

如果你的意思寫:

char * s = "Red"; 
if (Massachusetts) { 
    s = "Blue"; 
} 

然後剛纔添加的常量。它會正常工作。

如果你真的需要修改字符串,然後

char *s = malloc(64); 
strcpy (s, "Red"); 
if (Massachusetts) { 
    strcat(s, "-not"); 
} 
1

如果你不打算通過s修改指向的對象,改變s類型const char *s;

如果你打算修改它,然後將它指向一個內容非法修改的字符串(不管這是否對C語言非法,或者只是通過你程序的其他接口的合約)是一個嚴重的錯誤,並且您需要確保在有可能修改該字符串的情況下對該字符串進行復制。