字符* 与uint8_t的字符串比较

String comparison of char* to uint8_t

本文关键字:字符串 比较 uint8 字符      更新时间:2023-10-16

我是 C 和 C++ 的新手,似乎无法弄清楚我需要如何比较这些值:

变量我正在传递:

typedef struct {
uint8_t ssid[33];

我要匹配的字符串。我已经尝试了这两种方法:

uint8_t AP_Match = "MatchString";
unsigned char* AP_Match = "MatchString";

我如何尝试匹配:

if (strncmp(list[i].ssid, "MatchString")) {
if (list[i].ssid == AP_Match) {
if (list[i].ssid == "MatchString") {
// This one fails because String is undeclared, despite having 
// an include line for string.h
if (String(reinterpret_cast<const char*>(conf.sta.ssid)) == 'MatchString') {

我已经用几种不同的方式对此进行了研究,并进行了一些搜索。我知道其中一种或两种可能是错误的类型,但我不确定从我现在的位置到工作。

没有任何 C 标准定义的"字符串"类型。字符串只是基于所选编码存储为无符号值的字符数组。'string.h' 提供了各种用于比较、串联等的函数,但只有当你传递给它的值是一致的时,它才能工作。

运算符 "==" 对于字符串比较也是未定义的,因为它需要比较每个索引处的每个字符,对于两个大小可能不同且最终可能使用不同编码的数组,尽管具有相同的基础无符号整数表示形式(增加了误报比较的可能性(。你可以定义自己的函数来做到这一点(注意 C 不允许重载运算符(,但除此之外,你会坚持使用标准库提供的内容。

请注意,strncmp(( 采用一个大小参数来表示要比较的字符数(您的代码缺少此参数(。 https://www.tutorialspoint.com/c_standard_library/c_function_strncmp.htm

否则,您将查看函数 strcmp((,它要求输入字符串以 null 结尾(最后一个字符等于 '\0'(。最终,您需要考虑输入的可能组合是什么以及如何存储它们,并使用对所有可能性都具有鲁棒性的比较函数。

作为最后的旁注

if (list[i].ssid == "MatchString") {

由于 ssid是一个数组,您应该知道,当您进行此比较时,您实际上并不是在访问 ssid 的内容,而是访问 ssid 第一个元素的地址。当你将list[i].ssid传递到strcmp(或strncmp(时,你传递了一个指向内存中数组的第一个元素的指针。然后,该函数遍历整个数组,直到它达到空字符(在 strcmp 的情况下(或直到它比较了指定数量的元素(在 strncmp 的情况下(。

要匹配两个字符串,请使用strcmp

if (0==strcmp(str1, str2))

str1 和 str2 是保存以空结尾的字符串的内存地址。返回值零表示字符串相等。

在您的情况下:

if (0==strcmp(list[i].ssid, AP_Match))
if (0==strcmp(list[i].ssid, "MatchString"))