2012-04-19 248 views
4

我在C中有一個關於程序的愚蠢問題。我的編譯器說我: 警告:指針和整數之間的比較。我真的不知道爲什麼。 我只想在屏幕上寫每個字符。C中指針和整數之間的比較

我的代碼:

int i = 0; 
char str[50] = {'s', 'a', 'm', 'p','l','e'}; //only for test 
while (str[i] != NULL) { 
    putchar(str[i]); 
    i++; 
} 

你能幫助我嗎?我沒有在互聯網上找到任何有用的答案。

+2

嘗試與'\ 0'比較:) coz NULL ofcourse是一個指針。 – Milee 2012-04-19 07:04:46

回答

7

NULL是一個指針,而str[i]是str數組的第i個字符。 char是整數類型,當你比較它們時,你會得到警告。

我想你想檢查字符串的結尾,你會做一個值爲0(字符串結尾)的字符檢查,即'\0'

但是:這不會幫助你,因爲你將它定義爲字符數組而不是字符串,而且你沒有在char數組中定義終止0(你只是很幸運,它隱含在那裏)。

PS:下次你應該至少給出編譯器在抱怨的信息。

8

NULL只能在指針上下文中使用,但在這裏您將它與一個字符進行比較。

您通常會想是這樣的:

while (str[i] != '\0') { 

[或,當然,像puts(str);printf("%s", str);]

2

你需要 '與終端價值' 來比較STR [1] \ 0',而不是NULL,這被認爲是一個指針。你

while (str[i] != NULL) {

改爲

while (str[i] != '\0') {

下面

int i = 0; 
char str[50] = {'s', 'a', 'm', 'p','l','e'}; //only for test 
while (str[i] != '\0') { 
    putchar(str[i]); 
    i++; 
} 
-2

請寫你這樣的代碼

int i = 0; 
char str[50] = {'s', 'a', 'm', 'p','l','e'}; //only for test 
while (str[i] != "\0") { 
putchar(str[i]); 
i++; 
} 
+2

與字符串文字比較似乎是錯誤的(不會給出它的地址?)。 – 2012-04-19 07:06:43

+0

@JesseGood:與字符串*進行比較*是錯誤的;這是一個需要診斷的約束違規。 Santhosh:你應該在發佈之前編譯你的代碼。 – 2014-04-07 02:02:24

0

NULL被定義爲指針類型,通常爲(void*)0。這意味着它不應該與字符(當它們自己使用時被提升爲整數)進行比較。問題出在以下幾點:str[i] != NULL。正確的做法是將其與相同類型的東西進行比較,在這種情況下,您正在查找空字符'\0'

1

str[i]是一個字符。 NULL是一個指針。你不能有意義地比較這兩種數據類型(儘管它們可能或不可能被實現爲內部相同大小的整數)。這就是所有錯誤消息的含義。

不是說比較不僅是類型不正確,它也不會做你可能的意思。您似乎認爲具有不完整初始值設定項的字符數組將自動以\ 0字符終止,但該規則適用於字符串文字,而不適用於您自己創建的字符數組。事實上,你正在調用未定義的行爲。

0

這裏str [i]是一個字符,NULL是一個指針,所以我們不能在邏輯上進行比較。 使用'\ 0'與str [i]進行比較,因爲它被定義爲空字符,因此將字符str [i]與空字符'\ 0'進行比較 是正確的方法,並且不會通過 任何警告。

1

該代碼的最大問題是,根據您的實現,它可能會編譯沒有錯誤。

的問題,正如其他人所說,是NULL旨在代表一個空指針,不是一個空字符值。使用'\0'來表示空字符。 (或者你可以使用0,這是等效的,但'\0'更清楚地表達意圖。)

NULL是擴展到實現定義空指針常量宏。空指針常量可以是值爲0的整型常量表達式,也可以是轉換爲void*的表達式。這意味着NULL可以被定義爲0((void*)0)(以及其他變體)。

顯然你的實現將它定義爲類似((void*)0)的東西,這就是爲什麼你得到了警告消息。 (它可以,恕我直言,應該被視爲致命錯誤)。

因此,不要嘗試使用NULL以外的空指針常量 - 並且不要指望編譯器警告您是否濫用它。