我在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