OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10628|回复: 16

数组 与 字符串【怎样实现 简单 比较】STM32

[复制链接]

87

主题

569

帖子

0

精华

高级会员

Rank: 4

积分
831
金钱
831
注册时间
2014-9-30
在线时间
140 小时
发表于 2021-5-2 11:31:17 | 显示全部楼层 |阅读模式
16金钱
说起来这 应该是一个 很低级 的问题 :请看 语句:
数组 与 字符串【怎样实现 简单 比较】STM32 C语言

  uint8_t rx_Name[] = {0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30};

  xxxxxxxx 若干语句 xxxxxxxx

  if (rx_Name == {0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30})
  {
  xxxxxxxx 若干语句 xxxxxxxx
  xxxxxxxx 若干语句 xxxxxxxx
  }

  if (rx_Name == "00000000000000")        // 字符串 14个 "0" 编译可以过关,但是 执行结果不正确。
  {
  xxxxxxxx 若干语句 xxxxxxxx
  xxxxxxxx 若干语句 xxxxxxxx
  }

红色语句 —— 编译直接报错 ,不知道 怎么搞的 !?
紫色语句 —— 编译可以通过 , 但是执行结果 不对 。


俺不想使用 很繁琐的 函数去【逐个 比较】这样简单点 不行吗 ?
俺不想使用 很繁琐的 函数去【逐个 比较】这样简单点 不行吗 ?


现在的问题是——如何 才能 这样简单的 写出 STM32 的 C语言 ?

最佳答案

查看完整内容[请看2#楼]

数组名等于数组首地址,也就是所谓的指针,你应该取指针里面的内容作比较,而不是直接拿地址去作比较
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

25

主题

180

帖子

0

精华

高级会员

Rank: 4

积分
596
金钱
596
注册时间
2015-1-14
在线时间
152 小时
发表于 2021-5-2 11:31:18 | 显示全部楼层
数组名等于数组首地址,也就是所谓的指针,你应该取指针里面的内容作比较,而不是直接拿地址去作比较
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2021-5-2 11:56:08 | 显示全部楼层
type struct ABC{
  u8 ch[14];
};

const ABC abc={ {0x30, 0x30,.....0x30}};

ABC* abp_p = (ABC*)rx_Name;

  if (*abc_p ==abc)
     .........
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2021-5-2 19:18:09 | 显示全部楼层
#include <string.h>

………………

if (0 == memcmp(rx_Name, "00000000000000", sizeof(rx_Name))) {
    /* 相等的情况 */
}

memcmp是用于比较两片内存的一段长度内是否完全相同,是则返回0,否则返回非零。

NAME
       memcmp - compare memory areas

SYNOPSIS
       #include <string.h>

       int memcmp(const void *s1, const void *s2, size_t n);

DESCRIPTION
       The memcmp() function compares the first n bytes (each interpreted as unsigned char) of the memory ar
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

0

主题

103

帖子

0

精华

高级会员

Rank: 4

积分
632
金钱
632
注册时间
2016-3-30
在线时间
67 小时
发表于 2021-5-2 20:37:05 | 显示全部楼层
晕了,C语言里面的 == 符号没有这个字符串的比较功能。只能用函数。
回复

使用道具 举报

87

主题

569

帖子

0

精华

高级会员

Rank: 4

积分
831
金钱
831
注册时间
2014-9-30
在线时间
140 小时
 楼主| 发表于 2021-5-4 17:21:10 | 显示全部楼层
高级放牛娃 发表于 2021-5-2 20:37
晕了,C语言里面的 == 符号没有这个字符串的比较功能。只能用函数。

谢谢 讲解 ,, 那么 意思是 :

【两个 数组】不能 直接 比较 么 ??


回复

使用道具 举报

87

主题

569

帖子

0

精华

高级会员

Rank: 4

积分
831
金钱
831
注册时间
2014-9-30
在线时间
140 小时
 楼主| 发表于 2021-5-4 17:24:20 | 显示全部楼层
xkwy 发表于 2021-5-2 19:18
#include

………………

谢谢,谢谢 。。

我回头 试试你的 办法 。

数组也是 变量啊,两个数组 就是两个变量

按理说 应该可以 用 IF 语句 比较 吧 !?
回复

使用道具 举报

87

主题

569

帖子

0

精华

高级会员

Rank: 4

积分
831
金钱
831
注册时间
2014-9-30
在线时间
140 小时
 楼主| 发表于 2021-5-4 17:26:30 | 显示全部楼层
高级放牛娃 发表于 2021-5-2 20:37
晕了,C语言里面的 == 符号没有这个字符串的比较功能。只能用函数。

我今天 5月4号 又遇见 这个 类似问题 :请看图片
邪门邪门.png


看样子 也是:【数组】不能直接 用 IF 语句来 比较咯 !
回复

使用道具 举报

87

主题

569

帖子

0

精华

高级会员

Rank: 4

积分
831
金钱
831
注册时间
2014-9-30
在线时间
140 小时
 楼主| 发表于 2021-5-4 17:27:14 | 显示全部楼层
但是 编译器 为什么 不报错 呢 ??
回复

使用道具 举报

56

主题

343

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-3-8
在线时间
267 小时
发表于 2021-5-4 22:16:54 | 显示全部楼层
哈哈,兄弟应该是其他“高级”语言转C语言的吧。C语言不能直接比较数组。
首先 rx_Name == {0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30},这是语法上的错误。C语言没有这样的表达方式,编译器不认识,自然报错。
然后是这个"00000000000000"。这种写法,编译器会生成一个数组,然后把数组首地址给出。比如定义u8 table[]="123". 或者一个程序 void function(u8 *str)可以这么调用function("123")。
基于这点可以解释为什么rx_Name == "00000000000000" 合法可以编译通过。因为rx_Name 是数组名,是一个地址。"00000000000000"我解释了。编译器也是返回一个地址。两个地址自然可以比较。这两个地址肯定不会相同。执行自然不通过。
回复

使用道具 举报

56

主题

343

帖子

0

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-3-8
在线时间
267 小时
发表于 2021-5-4 22:53:13 | 显示全部楼层
caosix 发表于 2021-5-4 17:24
谢谢,谢谢 。。

我回头 试试你的 办法 。

数组不是变量,只是变量的集合。变量在内存中都是要占空间的。如果数组本身是变量,那定义u8 a[3];要占用几个字节呢???
所以数组只是语法约定好的变量的集合,数组名是这个集合的首地址。用数组名来比较,对编译器来说只不过是两个地址(常量)比较。
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2021-5-6 08:13:22 | 显示全部楼层
caosix 发表于 2021-5-4 17:27
但是 编译器 为什么 不报错 呢 ??

C语言里面数组和结构体不是基本数据结构,无法直接比较其内容。

数组在进行if比较、=赋值及函数传参的时候,会立即退化成一个指向首元素的成员指针,因此你这里仅仅是指针之间的比较(这在语法上是正确的,所以编译器不会报错)。这两个数组显然不在同一片内存,所以俩指针永不相等
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

2

主题

459

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4515
金钱
4515
注册时间
2018-5-14
在线时间
964 小时
发表于 2021-5-6 10:23:03 | 显示全部楼层
caosix 发表于 2021-5-4 17:27
但是 编译器 为什么 不报错 呢 ??

你比较的两个数组的指针是否相同,由于你是两个不同地址的数组,指针和指针比较,当然不报错,当然判断是不等的,C中没有字符串直接比较的办法,只能用string.h中的比较函数进行比较。
回复

使用道具 举报

87

主题

569

帖子

0

精华

高级会员

Rank: 4

积分
831
金钱
831
注册时间
2014-9-30
在线时间
140 小时
 楼主| 发表于 2021-5-9 20:29:58 | 显示全部楼层
本帖最后由 caosix 于 2021-5-9 20:31 编辑
xkwy 发表于 2021-5-6 08:13
C语言里面数组和结构体不是基本数据结构,无法直接比较其内容。

数组在进行if比较、=赋值及函数传参的 ...

谢谢 11楼,12楼 ,13楼 【等】 各位大神 。。

这下子 明白了 。 想 简单 看来不行 啊 。
回复

使用道具 举报

0

主题

71

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
360
金钱
360
注册时间
2017-10-10
在线时间
131 小时
发表于 2021-5-10 16:31:29 | 显示全部楼层
==比较字符串,兄弟是JAVA转过来的吗
回复

使用道具 举报

0

主题

103

帖子

0

精华

高级会员

Rank: 4

积分
632
金钱
632
注册时间
2016-3-30
在线时间
67 小时
发表于 2021-5-22 09:54:19 | 显示全部楼层
楼上都回复了。我就不重复了。

在Python、Java和C#中是可以的。
回复

使用道具 举报

16

主题

136

帖子

0

精华

高级会员

Rank: 4

积分
577
金钱
577
注册时间
2020-11-19
在线时间
113 小时
发表于 2021-5-22 17:57:43 | 显示全部楼层
八十、八十、八十!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-27 06:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表