9

我有一个关于 C 语言程序的愚蠢问题。我的编译器告诉我: 警告:指针和整数之间的比较。我真的不知道为什么。我只想在屏幕上写下每个字符。

我的代码:

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

你能帮我吗?我在互联网上没有找到任何有用的答案。

4

8 回答 8

10

NULL是一个指针,str[i]是 str 数组的第 i 个字符。char 是整数类型,当您比较它们时,您会收到警告。

我猜你想检查字符串的结尾,你会检查值为 0(字符串结尾)的字符,即'\0'.

但是:这对您没有帮助,因为您将它定义为字符数组而不是字符串,并且您没有在字符数组中定义终止 0(您很幸运,它是隐含的)。

PS:下次您应该至少提供编译器抱怨的信息。

于 2012-04-19T07:04:28.603 回答
9

NULL 只应在指针上下文中使用,但在这里您将其与字符进行比较。

你通常想要这样的东西:

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

[或者,当然,类似puts(str);or printf("%s", str);]

于 2012-04-19T07:02:25.717 回答
2

您需要将 str[i] 的值与字符串的终止 '\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++;
}
于 2012-04-19T07:02:30.617 回答
2

该代码的最大问题是,根据您的实现,它可能编译时不会出错。

正如其他人所说,问题在于NULL它旨在表示空指针值,而不是空字符值。用于'\0'表示空字符。(或者您可以使用0,它是等效的,但'\0'更清楚地表达了意图。)

NULL是一个扩展为实现定义的空指针常量的宏。空指针常量可以是具有值的整数常量表达式,也可以是强制0转换为 的表达式void*。这意味着NULL可以将其定义为0或定义为((void*)0)(以及其他变体)。

显然,您的实现将其定义为类似((void*)0),这就是您收到警告消息的原因。(它可以而且恕我直言应该被视为致命错误)。

因此,切勿尝试将其NULL用作空指针常量——并且不要指望编译器会在您滥用它时警告您。

于 2014-04-07T02:10:33.070 回答
1

str[i]是一个字符。NULL是一个指针。您无法有意义地比较这两种数据类型(尽管它们可能会或可能不会在内部实现为相同大小的整数)。这就是错误消息的全部含义。

并不是说比较不仅类型不正确,而且也不符合您的意思。您似乎假设具有不完整初始化程序的字符数组将自动以 \0 字符终止,但该规则适用于字符串文字,而不适用于您自己创建的字符数组。实际上,您正在调用未定义的行为。

于 2012-04-19T07:07:11.213 回答
0

NULL被定义为指针类型,通常是(void*)0. 这意味着它不应与字符(单独使用时被提升为整数)进行比较。问题出在以下几点:str[i] != NULL. 正确的做法是将其与相同类型的东西进行比较,在这种情况下,您正在寻找空字符'\0'.

于 2012-04-19T07:03:32.953 回答
0

这里 str[i] 是一个字符,NULL 是一个指针,所以我们不能在逻辑上比较它。使用 '\0' 与 str[i] 进行比较,因为它被定义为空字符,因此将字符 str[i] 与空字符 '\0' 进行比较是正确的方法,不会通过任何警告。

于 2012-04-19T08:01:35.033 回答
-2

请像这样写你的代码

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-19T07:02:53.327 回答