C中指针和整数的比较

时间:2012-04-19 07:00:03

标签: c pointers

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

我的代码:

int i = 0;
char str[50] = {'s', 'a', 'm', 'p','l','e'}; //only for test
while (str[i] != NULL) {
    putchar(str[i]);
    i++;
}
你能帮帮我吗?我没有在互联网上找到任何有用的答案。

8 个答案:

答案 0 :(得分:9)

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

我想你要检查字符串的结尾,你会检查一下值为0(字符串结尾)的char,即'\0'

但是:这不会帮助你,因为你定义它和字符数组而不是字符串,你没有在char数组中定义终止0(你很幸运,它隐含在那里)。

PS:下次你应该至少给出编译器抱怨的信息。

答案 1 :(得分:8)

NULL只应在指针上下文中使用,但在这里你要将它与一个字符进行比较。

您通常需要以下内容:

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

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

答案 2 :(得分: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++;
}

答案 3 :(得分:1)

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

并不是说比较不仅是类型错误,它也不会做你可能意味着什么。您似乎假设具有不完整初始值设定项的字符数组将自动以\ 0字符终止,但该规则适用于字符串文字,而不适用于您自己创建的字符数组。实际上,你正在调用未定义的行为。

答案 4 :(得分:1)

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

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

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

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

因此,除了作为空指针常量之外,永远不要尝试使用NULL - 如果您滥用它,请不要指望编译器警告您。

答案 5 :(得分:0)

NULL被定义为指针类型,通常为(void*)0。这意味着它不应该与字符进行比较(当它们自己使用时会被提升为整数)。问题出在以下方面:str[i] != NULL。执行此操作的正确方法是将其与相同类型的内容进行比较,在这种情况下,您要查找空字符'\0'

答案 6 :(得分:0)

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

答案 7 :(得分:-2)

请写这样的代码

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