您尚未登录。

楼主 #1 2020-03-04 01:06:24

OggyJFX
会员
注册时间: 2019-05-21
已发帖子: 109
积分: 108.5

stc8a8k strcmp的问题

printf("strcmp=0x%bx\n", strcmp("123", "123"));
    printf("strcmp=0x%bx\n", strcmp("1234", "123"));
    printf("strcmp=0x%bx\n", strcmp("123", "1234"));
    printf("strcmp=0x%bx\n", strcmp("1233", "1234"));

这几个函数,打印出来的结果,都是strcmp=1
真是日了狗了,这是为啥?

离线

#2 2020-03-04 08:57:17

我心飞翔
会员
注册时间: 2019-12-25
已发帖子: 82
积分: 82

Re: stc8a8k strcmp的问题

if (strcmp("123", "123"))
{
    print("0000000000000\n");
}
else
{
    print("11111111111111\n");
}


这样试一试。

离线

#3 2020-03-04 10:24:23

metro
会员
注册时间: 2019-03-09
已发帖子: 442
积分: 486

Re: stc8a8k strcmp的问题

楼主的代码用了%bx,应该是Keil C51编译的吧?
我在本地编译并仿真了一下,结果是正确的。测试代码如下:

#include <stdio.h>
#include <string.h>

sfr SCON = 0x98;
sbit TI = SCON^1;

void main(void)
{
    TI = 1;
    
    printf("strcmp=0x%bx\n", strcmp("123", "123"));
    printf("strcmp=0x%bx\n", strcmp("1234", "123"));
    printf("strcmp=0x%bx\n", strcmp("123", "1234"));
    printf("strcmp=0x%bx\n", strcmp("1233", "1234"));
    
    for (;;);
}

输出结果如下:

strcmp=0x0
strcmp=0x1
strcmp=0xff
strcmp=0xff

楼主把反汇编的结果放上来看看?

最近编辑记录 metro (2020-03-04 10:25:18)

离线

楼主 #4 2020-03-04 10:49:50

OggyJFX
会员
注册时间: 2019-05-21
已发帖子: 109
积分: 108.5

Re: stc8a8k strcmp的问题

metro 说:

楼主的代码用了%bx,应该是Keil C51编译的吧?
我在本地编译并仿真了一下,结果是正确的。测试代码如下:

#include <stdio.h>
#include <string.h>

sfr SCON = 0x98;
sbit TI = SCON^1;

void main(void)
{
    TI = 1;
    
    printf("strcmp=0x%bx\n", strcmp("123", "123"));
    printf("strcmp=0x%bx\n", strcmp("1234", "123"));
    printf("strcmp=0x%bx\n", strcmp("123", "1234"));
    printf("strcmp=0x%bx\n", strcmp("1233", "1234"));
    
    for (;;);
}

输出结果如下:

strcmp=0x0
strcmp=0x1
strcmp=0xff
strcmp=0xff

楼主把反汇编的结果放上来看看?

软件仿真的结果是对的,download到芯片里面跑,就不正确了。
使用strncmp,就没有问题。像下面这样写:
printf("strncmp=0x%bx\n", strncmp("123", "123", 3));
printf("strncmp=0x%bx\n", strncmp("1234", "123", 4));
printf("strncmp=0x%bx\n", strncmp("123", "1234", 4));
printf("strncmp=0x%bx\n", strncmp("1233", "1234", 4));

离线

#5 2020-03-04 10:59:20

metro
会员
注册时间: 2019-03-09
已发帖子: 442
积分: 486

Re: stc8a8k strcmp的问题

OggyJFX 说:

软件仿真的结果是对的,download到芯片里面跑,就不正确了。
使用strncmp,就没有问题。像下面这样写:
printf("strncmp=0x%bx\n", strncmp("123", "123", 3));
printf("strncmp=0x%bx\n", strncmp("1234", "123", 4));
printf("strncmp=0x%bx\n", strncmp("123", "1234", 4));
printf("strncmp=0x%bx\n", strncmp("1233", "1234", 4));

神奇,要不自己写个strcmp?

char mystrcmp(const char *str1, const char *str2)
{
    while (*str1 || *str2) {
        if (*str1 < *str2)
            return -1;
        else if (*str1 > *str2)
            return 1;
        ++str1;
        ++str2;
    }

    return 0;
}

最近编辑记录 metro (2020-03-04 10:59:53)

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn