我在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++;
}
你能幫助我嗎?我沒有在互聯網上找到任何有用的答案。
我在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++;
}
你能幫助我嗎?我沒有在互聯網上找到任何有用的答案。
NULL
是一個指針,而str[i]
是str數組的第i個字符。 char是整數類型,當你比較它們時,你會得到警告。
我想你想檢查字符串的結尾,你會做一個值爲0(字符串結尾)的字符檢查,即'\0'
。
但是:這不會幫助你,因爲你將它定義爲字符數組而不是字符串,而且你沒有在char數組中定義終止0(你只是很幸運,它隱含在那裏)。
PS:下次你應該至少給出編譯器在抱怨的信息。
NULL只能在指針上下文中使用,但在這裏您將它與一個字符進行比較。
您通常會想是這樣的:
while (str[i] != '\0') {
[或,當然,像puts(str);
或printf("%s", str);
]
你需要 '與終端價值' 來比較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++;
}
請寫你這樣的代碼
int i = 0;
char str[50] = {'s', 'a', 'm', 'p','l','e'}; //only for test
while (str[i] != "\0") {
putchar(str[i]);
i++;
}
與字符串文字比較似乎是錯誤的(不會給出它的地址?)。 – 2012-04-19 07:06:43
@JesseGood:與字符串*進行比較*是錯誤的;這是一個需要診斷的約束違規。 Santhosh:你應該在發佈之前編譯你的代碼。 – 2014-04-07 02:02:24
NULL
被定義爲指針類型,通常爲(void*)0
。這意味着它不應該與字符(當它們自己使用時被提升爲整數)進行比較。問題出在以下幾點:str[i] != NULL
。正確的做法是將其與相同類型的東西進行比較,在這種情況下,您正在查找空字符'\0'
。
str[i]
是一個字符。 NULL
是一個指針。你不能有意義地比較這兩種數據類型(儘管它們可能或不可能被實現爲內部相同大小的整數)。這就是所有錯誤消息的含義。
不是說比較不僅是類型不正確,它也不會做你可能的意思。您似乎認爲具有不完整初始值設定項的字符數組將自動以\ 0字符終止,但該規則適用於字符串文字,而不適用於您自己創建的字符數組。事實上,你正在調用未定義的行爲。
這裏str [i]是一個字符,NULL是一個指針,所以我們不能在邏輯上進行比較。 使用'\ 0'與str [i]進行比較,因爲它被定義爲空字符,因此將字符str [i]與空字符'\ 0'進行比較 是正確的方法,並且不會通過 任何警告。
該代碼的最大問題是,根據您的實現,它可能會編譯沒有錯誤。
的問題,正如其他人所說,是NULL
旨在代表一個空指針值,不是一個空字符值。使用'\0'
來表示空字符。 (或者你可以使用0
,這是等效的,但'\0'
更清楚地表達意圖。)
NULL
是擴展到實現定義空指針常量宏。空指針常量可以是值爲0
的整型常量表達式,也可以是轉換爲void*
的表達式。這意味着NULL
可以被定義爲0
或((void*)0)
(以及其他變體)。
顯然你的實現將它定義爲類似((void*)0)
的東西,這就是爲什麼你得到了警告消息。 (它可以,恕我直言,應該被視爲致命錯誤)。
因此,不要嘗試使用NULL
以外的空指針常量 - 並且不要指望編譯器警告您是否濫用它。
嘗試與'\ 0'比較:) coz NULL ofcourse是一個指針。 – Milee 2012-04-19 07:04:46