[英]Comparison between pointer and integer in 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。 char是整数类型,当你比较它们时会得到警告。
我想你想检查字符串的结尾,你会检查一下值为0(字符串结尾)的char,即'\\0'
。
但是:这不会帮助你,因为你定义它和字符数组而不是字符串,你没有在字符数组中定义终止0(你很幸运,它隐含在那里)。
PS:下次你应该至少给出编译器抱怨的信息。
NULL应仅用于指针上下文,但在此您将其与字符进行比较。
你通常想要这样的东西:
while (str[i] != '\0') {
[或者,当然,像puts(str);
或printf("%s", str);
]
您需要将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++;
}
str[i]
是一个角色。 NULL
是一个指针。 您无法有意义地比较这两种数据类型(尽管它们可能会或可能不会在内部实现相同的整数大小)。 这就是所有错误信息的含义。
并不是说比较不仅类型不正确,它也不会做你可能的意思。 您似乎假设具有不完整初始值设定项的字符数组将自动以\\ 0字符终止,但该规则适用于字符串文字,而不适用于您自己创建的字符数组。 实际上,您正在调用未定义的行为。
该代码的最大问题是,根据您的实现,它可能会编译而不会出错。
正如其他人所说,问题是NULL
旨在表示空指针值,而不是空字符值。 使用'\\0'
表示空字符。 (或者你可以使用0
,这是等价的,但'\\0'
更清楚地表达了意图。)
NULL
是一个扩展为实现定义的空指针常量的宏。 空指针常量可以是值为0
的整型常量表达式,也可以是转换为void*
的表达式。 这意味着NULL
可以定义为0
或((void*)0)
(以及其他变体)。
显然,您的实现将其定义为类似((void*)0)
,这就是您收到警告消息的原因。 (可能,恕我直言,应该被视为致命错误)。
因此,除了作为空指针常量之外,永远不要尝试使用NULL
- 并且如果您滥用它,请不要指望编译器警告您。
NULL
定义为指针类型,通常为(void*)0
。 这意味着它不应该与字符进行比较(当它们自己使用时会被提升为整数)。 问题在于: str[i] != NULL
。 执行此操作的正确方法是将其与相同类型的内容进行比较,在这种情况下,您要查找空字符'\\0'
。
这里str [i]是一个字符,NULL是一个指针,所以我们无法在逻辑上进行比较。 使用'\\ 0'与str [i]进行比较,因为它被定义为空字符,因此将字符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++;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.