| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1020 人关注过本帖
标题:为什么这样比较会出问题
只看楼主 加入收藏
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
结帖率:99.25%
收藏
已结贴  问题点数:20 回复次数:11 
为什么这样比较会出问题
想用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: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10570
专家分:43038
注 册:2014-5-20
收藏
得分:0 
long型不能直接用strcmp比较,试试左移8位(有溢出问题)。
long int a[]={11111111,22222222,33333333,33333333,44444444,11111111,22222222};
int *p=a;
p、a 类型不同?

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

2017-01-06 11:34
九转星河
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: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10570
专家分:43038
注 册:2014-5-20
收藏
得分:0 
回复 4楼 九转星河
不明白为何用strcmp比较数值类型?
strcmp是比较字符串(以'\0'结束)。一个数值在其内存空间中可能有多个'\0'或没有'\0',还有对不同的硬件或编译环境存在高低位的问题。
2017-01-06 14:11
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:5 
这样比较当然行,但必须有个数据范围,对于int类型(4字节)数必须为0-16777215的正数,不能为负数,这样确保int类型数的最高一字节的数据为00,好作为strcmp进行字节比较的结束符(字符串结束符)。当然有时候即使int类型最高位不是00,但恰好第5个字节是0,也会误打误撞得到正确结果。
2017-01-06 14:14
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10570
专家分:43038
注 册:2014-5-20
收藏
得分:15 
不只是高低位问题。
如:
a=0x00110011;
b=0x00120011;
strcmp(&a,&b)看看


2017-01-06 14:59
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10570
专家分:43038
注 册:2014-5-20
收藏
得分:0 
可以按字节比较
#include <stdio.h>
#include <string.h>

int _numcmp(long n1, long n2)
{
    char *p1=(char *)&n1, *p2=(char *)&n2;
    int i;
    for (i=0; i<sizeof(long); i++)
        if (*p1++ != *p2++)
            return 0;
    return 1;
}

main()
{
    long a[]={11111111,22222222,33333333,33333333,44444444,11111111,22222222};
    int i, j, n=sizeof(a)/sizeof(long);
    for (i=0; i<n-1; i++)
        for (j=i+1; j<n; j++)
            if (_numcmp(a[i], a[j]))
                printf("%d %d %d %d\n", i,j,a[i],a[j]);
}

2017-01-06 15:02
九转星河
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
快速回复:为什么这样比较会出问题
数据加载中...
 
   



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

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