2012-04-17 89 views
0

我剛剛遇到一個奇怪的問題。C中的字符串奇怪

此代碼:

int l = strlen(output); // l = 20 (believe me) 
char withoutLeadingZeroes[20] = ""; 

,這並不:

int l = strlen(output); // l = 20 (believe me) 
char withoutLeadingZeroes[l] = ""; 

我收到此錯誤

數組初始化函數必須是一個初始化列表或字符串文字

我真的不明白。有什麼建議麼? 來自維也納的問候:-)

+0

你是什麼意思「它不工作」? – cnicutar 2012-04-17 12:52:01

+2

「不起作用」對於編程問題幾乎從不是有用的解釋。你看到的結果是什麼? – FatalError 2012-04-17 12:52:50

+2

另請參閱:http://stackoverflow.com/questions/6634888/why-cant-i-initialize-a-variable-sized-array – Matt 2012-04-17 12:53:50

回答

2

您不能以這種方式使用變量初始化任何類型的靜態數組。我相信它必須是const。

VS2010: error C2057: expected constant expression

+2

不僅僅是一個常量,一個編譯時間常量,它們並不總是相同的東西。 – Matt 2012-04-17 12:56:01

+0

好吧,我想你是對的。我沒有真正關注「關鍵字」中的「const」,但我應該相應地寫出它。 – 2012-04-17 12:57:41

+0

謝謝,我會記住這一點,儘管在這種情況下「l」表示值爲20. – 2012-04-17 13:00:01

0

C不支持VLA(可變lenght陣列),也許C99開始不知道在什麼C標準VLA中得到

建議:

int len = strlen(output); 
char * wo_zeros = (char *)malloc(len); 
strcpy(wo_zeros, ""); 
//do something with wo_zeros 
free(wo_zeros); 
+0

你很對,對不起!我使用的是Xcode(最新版本),錯誤提示「數組初始化必須是初始化列表或字符串文字」。 – 2012-04-17 12:57:27

+0

好吧:)但你爲什麼對不起? – 2012-04-17 12:58:34

+0

這是我在這裏的第一篇文章,所以我忘了一些必需品。 – 2012-04-17 13:03:30

1

Online C99 Standard (n1256)

6.7.8初始化
...
3要初始化的實體的類型應該是未知大小的數組或不是可變長度數組類型的對象類型 。

聲明char withoutLeadingZeroes[l] = "";聲明withoutLeadingZeros作爲變長數組,並試圖爲你在這裏做初始化它是一個約束衝突。

雖然診斷可能會更清晰一點。

編輯

你能指出確切其中線獲得誤差?我用gcc得到了一個更清晰的診斷,並且我認爲 XCode在後臺運行gcc。

+0

謝謝。錯誤是:「數組初始化必須是一個初始化列表或字符串文字」如果我在前面的行中做「int l = 20」,我也會得到錯誤,但是如果我做了「const int l = 20」,它就可以工作。這是我不明白的。 (l的值在編譯時已知!) – 2012-04-18 16:21:06

+0

哇。你是否將它編譯爲C或C++?並且錯誤是否給出了確切的行號? – 2012-04-18 16:43:18

+0

呵呵。顯然,我錯誤地使用gcc的XCode;自從3.2開始使用LLVM和clang。每天學些新東西。 – 2012-04-18 16:52:31