| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1049 人关注过本帖
标题:为什么这样比较会出问题
取消只看楼主 加入收藏
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
结帖率:99.25%
收藏
已结贴  问题点数:20 回复次数:6 
为什么这样比较会出问题
想用strcmp对long int 型进行比较,却出了问题
奇怪的是,却不是全部出了问题~~~数据111111111却没有提示输入重复,不知道具体原因……求解~~~

程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LEN sizeof(Node)
typedef struct Node
{
    long int num;
    struct Node *next;
    struct Node *back;
}Node;
Node *head=NULL;
int n=0;
void insert(Node *p1,Node *p2)
{
    if (p1==head)
    {
        p2->next=head;
        p2->back=NULL;
        head->back=p2;
        head=p2;

        return;
    }

    p2->back=p1->back;
    p1->back->next=p2;
    p2->next=p1;
    p1->back=p2;

    return;
}

void fun(long int a)
{
    Node *p=head;
    Node *p2=NULL;

    if (head==NULL)
    {
        p=head=(Node *)malloc(LEN);
        head->next=NULL;
        head->back=NULL;
        head->num=a;
        n++;
        return ;
    }

    while (p->num>a&&p->next)
        p=p->next;

    if (strcmp(&(char)p->num,&(char)a)==0)//为什么这样比较会出问题???~~~
        return ;//然而,改用if (p->num==a)就没事了~~~

    n++;

    p2=(Node *)malloc(LEN);

    p2->num=a;

    if (p->num>a)
    {
        p->next=p2;
        p2->back=p;
        p2->next=NULL;
        return ;
    }

    insert(p,p2);
}
void print()
{
    Node *p=head;

    printf("不同的数:\n");

    while (p)
    {
        printf("%ld\n",p->num);
        p=p->next;
    }
}
int main()
{
    long int a[]={11111111,22222222,33333333,33333333,44444444,11111111,22222222};

    long int *p=a;

    for (;p-a<sizeof(a)/sizeof(long int);++p)
        fun(*p);

    print();

    printf("共有%d个不重复的数字\n",n);

    return 0;
}




[此贴子已经被作者于2017-1-6 12:08编辑过]

2017-01-06 11:14
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 2楼 吹水佬
以下是引用吹水佬在2017-1-6 11:34:01的发言:

long型不能直接用strcmp比较,试试左移8位(有溢出问题)。
long int a[]={11111111,22222222,33333333,33333333,44444444,11111111,22222222};
int *p=a;
p、a 类型不同?


我改了,但是还是不行耶~那个左移8位不是很懂是什么意思,能否解释一下~~

if (strcmp(&(char)p->num,&(char)a)==0)~~这样改还是不行耶~~

但是测试小数据的时候就没问题了估计也是数据溢出问题~

但具体怎么会数据溢出

其实,我是想通过这种通用的方法来比较不同类型的数据(包含字符串和int型)~感觉在极端情况下还是行不通~~~

[此贴子已经被作者于2017-1-6 11:55编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-06 11:43
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
long int a[]={1111111,2222222,3333333,3333333,4444444,1111111,2222222};

然而这组测试数据却是过关的~

是不是存在数据溢出?????
为什么强制转型(long int 转char)后还是会有问题????

是不是和数据的储存方式有关如果是,那么int 型和char 型的数据储存方式有什么不同呢????~~~~

[此贴子已经被作者于2017-1-6 12:04编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-06 11:58
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
感谢大佬指点,我先去测试一下~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-06 17:51
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
if (strncmp(&(char)p->num,&(char)a,sizeof(long int))==0)

这样似乎没有问题了(还是有问题)……

大概最高位字节不为0,strcmp比较越界……~~~

看了七楼,还是有别的问题~~strcmp在内存里面遇到00就不继续比较了~~

[此贴子已经被作者于2017-1-6 18:20编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-06 17:58
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 7楼 吹水佬
为什么结果会为0~~~~

明白了,遇到00则strcmp不再比较了……~~~

[此贴子已经被作者于2017-1-6 18:11编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-06 18:08
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
测试代码~~~

程序代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    int a,b;
    char s1[100]="\0";
    char s2[100]="\0";
    a=0x00010011;
    b=0x00020011;

    sprintf(s1,"%x",a);
    sprintf(s2,"%x",b);
    printf("%d\n",strcmp(&(char)a,&(char)b));
    printf("%s\n%s\n",s1,s2);
    printf("%d\n",strcmp(s1,s2));
}


[此贴子已经被作者于2017-1-6 18:41编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-01-06 18:31
快速回复:为什么这样比较会出问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021993 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved