Chinaunix

标题: 求“ 警告:比较指针和整数”的解决方法 [打印本页]

作者: pc521    时间: 2010-02-10 12:14
标题: 求“ 警告:比较指针和整数”的解决方法
本帖最后由 JohnBull 于 2010-02-13 02:36 编辑

  1. #include<stdio.h>
  2. #include<ctype.h>
  3. main()
  4. {
  5.         char s[]="12as056;^*&";
  6.         int i;
  7.         for(i=0;s[i]!=NULL;i++)
  8.         {
  9.                 if(isalpha(s[i]))
  10.                 {
  11.                         printf("%c is a number or character.\n",s[i]);
  12.                 }
  13.         }
  14. }
复制代码
编译时出现以下警告,怎么解决阿?
practice24.c: In function ‘main’:
practice24.c:7: 警告:比较指针和整数
作者: jtkk    时间: 2010-02-10 12:59
比较指针和整数是因为这句:if(isalpha(s)),isalpha需要一个int参数,你却传了数组指指针;
for循环是个死循环!
作者: daybreakcx    时间: 2010-02-10 13:29
我都怀疑你是不是插入代码部分命令没打全,导致显示那个方括号i被隐掉了
作者: okocha-jay    时间: 2010-02-10 16:07
for那里应该是 s[i] != '\0' 吧。
作者: proge    时间: 2010-02-10 18:06
首先动态字串和字符指针一样,都需要分配、回收空间。所以这样写
char s[]="12as056;^*&";
应该会导致Segment Fault。
其次,循环中没有改变s,所以要么是死循环(假设前面正确的对s赋了值),要么不会进入循环。

我猜你需要的程序应该这样写:
  1. #include <stdio.h>
  2. #include <ctype.h>

  3. main()
  4. {
  5.   char s[11] = "12as056;^*&";
  6.   char* p = s;
  7.   char c;
  8.   for(c=*p;c;c=*++p)
  9.   {
  10.     printf("%c\n", c);
  11.     if(isalpha(c))
  12.     {
  13.       printf("%c is a character.\n", c);
  14.     }
  15.   }
  16. }
复制代码
在Ubuntu 9.10 x64 GCC 4.3上测试过。
作者: proge    时间: 2010-02-10 18:17
另外再补充一点,象身份证号到底应该定义为char s[19],还是char s[18]?可以就拿这个程序做个试验。定义为char s[18]错了?这个问题我和某个面试我的牛X争论过,他说还要一位来存"\0"……后来还出口成脏……

解释如下:
C/C++中数组下标是以零开始的,所以char s[18]实际上定义了19个元素的数组,并由系统自动补零。
但是如果使用char s[]或者char *s,都需要s = malloc(19)。

人可以无知,但不要无理。技术争论是有意义的,但到了人身攻击就无聊了。
作者: starwing83    时间: 2010-02-10 18:25
char s[] = "...."是可以的,这个是C的一个特例:如果给出了初始化序列,则可以不写数组大小。

另外,这段代码显然是从论坛复制的,论坛[i]是斜体的意思,从而丢失了这几个字符……
作者: w_anthony    时间: 2010-02-10 21:30
回复 6# proge


    我觉得你需要面壁思过下了……
作者: 想飞的蜗牛    时间: 2010-02-10 21:44
char s[18]实际上定义了19个元素的数组



作者: pmerofc    时间: 2010-02-10 21:47
提示: 作者被禁止或删除 内容自动屏蔽
作者: bluewaterray    时间: 2010-02-10 21:49
s!=NULL 永远为真,不要搞混了数组名和指针,或者漏掉东西,如  [i]
作者: wtan    时间: 2010-02-11 01:33
另外再补充一点,象身份证号到底应该定义为char s[19],还是char s[18]?可以就拿这个程序做个试验。定义为 ...
proge 发表于 2010-02-10 18:17



    如果是个笑话,那么毫无疑问讲得非常成功。
作者: lllaaa    时间: 2010-02-11 09:29
人家骂你真是活该

你printf("sizeof(s[18])=%d", sizeof(s));看看等于18还是19.

另外再补充一点,象身份证号到底应该定义为char s[19],还是char s[18]?可以就拿这个程序做个试验。定义为 ...
proge 发表于 2010-02-10 18:17

作者: daybreakcx    时间: 2010-02-11 09:44
一直认为char s[18]下标从0到17共申请了18个char的飘过{:3_186:}
作者: yylogo    时间: 2010-02-11 10:52
isalpha(s[i])
printf("%c is a number or character.\n",s[i]);
作者: yulihua49    时间: 2010-02-11 11:00
[code]
#include
#include
main()
{
        char s[]="12as056;^*&";
        int i;
        fo ...
pc521 发表于 2010-02-10 12:14



    isalpha(*s)
作者: proge    时间: 2010-02-11 22:41
我想知道程序跑过没?在什么操作系统下?使用什么编译的?
我承认我既不懂C,也不会C++。望各位高人嘴下留德。
作者: w_anthony    时间: 2010-02-11 23:22
char[18]字节对齐一下,估计也得分配20个字节,越个界没出问题也没啥奇怪的。不过可以试试char[20],不知道用char[20]在怎样的操作系统用什么编译器编译完再跑一下,能确保不出问题的。
作者: proge    时间: 2010-02-12 00:05
楼上正解。
作者: 松饼熊    时间: 2010-02-12 09:54
最近,这里基础知识的缺乏真是能够超越任何想象的底线。
(PS:不是特指这个帖子)
作者: diffo    时间: 2010-02-12 13:43
char[18]字节对齐一下,估计也得分配20个字节,越个界没出问题也没啥奇怪的。不过可以试试char[20],不知道 ...
w_anthony 发表于 2010-02-11 23:22



    char[]这种也有字节对齐啊?
作者: w_anthony    时间: 2010-02-12 15:32
char[]这种也有字节对齐啊?
diffo 发表于 2010-02-12 13:43



    虽然没有研究过汇编代码,不过如果char[]后面定义的不是char或者short的话,应该是有对齐的,总不能让一个int或者long跨在中间吧?
作者: on-fire    时间: 2010-02-13 00:24
虽然没有研究过汇编代码,不过如果char[]后面定义的不是char或者short的话,应该是有对齐的,总不 ...
w_anthony 发表于 2010-02-12 15:32


建议阅读两本书《c陷阱与缺陷》、《c专家编程》会对您的疑惑解释比较清晰。另外《c和指针》可能还写得比较详细点。
作者: JohnBull    时间: 2010-02-13 02:34
最近,这里基础知识的缺乏真是能够超越任何想象的底线。
(PS:不是特指这个帖子)
松饼熊 发表于 2010-02-12 09:54



    同感,上次有个分不清虚拟内存和交换内存的,技术不行还穷横,我给转到新闻版了。这贴要是一直这样下去,我也得转到娱乐版块...
作者: JohnBull    时间: 2010-02-13 02:39
本帖最后由 JohnBull 于 2010-02-13 02:41 编辑
编译时出现以下警告,怎么解决阿?
practice24.c: In function ‘main’:
practice24.c:7: 警告:比较指针 ...
pc521 发表于 2010-02-10 12:14



很简单——你把代码写对了就解决了!

s【i】是什么类型? NULL是什么类型?

学物理的时候老师教过“没有单位的数字是没意义的”;
学C的时候老师应该教过“没有类型的符号是没意义的”!
作者: pc521    时间: 2010-02-13 12:14
另外再补充一点,象身份证号到底应该定义为char s[19],还是char s[18]?可以就拿这个程序做个试验。定义为 ...
proge 发表于 2010-02-10 18:17



    晕,char s[18]是指这个数组只有18个元素,s[18]才是第19个元素。你再去看看C语言书吧!
作者: pc521    时间: 2010-02-13 12:44
真服了你们这些所谓的高手了!
首先char s[]=".......";是没错误的!
在for循环里
  1. for(i=0;s[i]!=NULL;i++)
复制代码
怎么就没有改变值了,怎么就是死循环了?
作者: pc521    时间: 2010-02-13 12:48
我想知道程序跑过没?在什么操作系统下?使用什么编译的?
我承认我既不懂C,也不会C++。望各位高人嘴下留 ...
proge 发表于 2010-02-11 22:41



RedHat    Linux ,GCC编译!
作者: w_anthony    时间: 2010-02-13 13:12
本帖最后由 w_anthony 于 2010-02-13 13:14 编辑
建议阅读两本书《c陷阱与缺陷》、《c专家编程》会对您的疑惑解释比较清晰。另外《c和指针》可能还写得比 ...
on-fire 发表于 2010-02-13 00:24



    您想说什么请明言,没必要大海捞针去找答案吧?更何况怎么编排内存结构是编译器事情,而不完全是语言的事情。

这次我用VC7编译了一下,分析了反汇编代码,例如

  1.         long t = -1;
  2.         char buf[18] = ".0123456789abcdef";
  3.         buf[18] = '\0';
  4.         printf("%ld", l);
复制代码
这样t的地址在buf后面,现在就看buf[18]会不会访问到t了。
不开优化(代码太简单,开优化怕面目全非),在基本运行时检查开启/RTCsu的情况下,t或者buf等每一个变量的后面都会补上不定数目的字节,内容为CC,而buf[18] = '\0',则是将第一个CC改成00,并不会访问到t,然后在函数返回前CheckStack的时候会检测到这个CC被改变,报告栈访问出错;如果基本运行时检查选默认,也就是关闭检查,那么buf后面会补上2个字节,内容随机(也就是当时是什么就是什么,不做特殊修改),然后紧跟着t,所以buf[18] = '\0'也没有访问到t,而且因为没有CheckStack,所以正常退出。
结论就是字节对齐是存在的。
作者: daybreakcx    时间: 2010-02-13 13:42
空指针常量,楼上正解,别再争了,封帖吧~~
作者: pc521    时间: 2010-02-13 18:12
w_anthony 发表于 2010-02-13 13:22



    哦,原理如此!谢谢了!
作者: yulihua49    时间: 2010-02-15 21:43
编译时出现以下警告,怎么解决阿?
practice24.c: In function ‘main’:
practice24.c:7: 警告:比较指针 ...
pc521 发表于 2010-02-10 12:14



    for(i=0;s!=0;i++)
作者: newIT666    时间: 2010-02-16 18:29
本帖最后由 newIT666 于 2010-02-16 18:31 编辑
编译时出现以下警告,怎么解决阿?
practice24.c: In function ‘main’:
practice24.c:7: 警告:比较指针 ...
pc521 发表于 2010-02-10 12:14



  1.     for(i=0;s[i]!=NULL;i++)
复制代码
改为

  1.    for(i=0;s[i]!='\0';i++)
复制代码

  1. for(i=0;s[i]!=0;i++)
复制代码
即可.
作者: chinesedragon    时间: 2010-02-19 11:28
另外再补充一点,象身份证号到底应该定义为char s[19],还是char s[18]?可以就拿这个程序做个试验。定义为 ...
proge 发表于 2010-02-10 18:17



    有时还真能见一些个牛人:wink:
作者: chinesedragon    时间: 2010-02-19 11:43
怎么原贴给编辑了呢?????、
作者: joiky    时间: 2010-02-20 09:44
for(i=0;s[i]!=NULL;i++)

这个NULL在C里面被宏指为:(void*)0
作者: fera    时间: 2010-02-20 10:03
proge真牛人也!无知无畏且不认真学习之牛啊!
作者: hannimao1    时间: 2012-09-28 00:08
为什么这种警告

不能调试




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2