首页 > 解决方案 > char* 与 uint8_t 的字符串比较

问题描述

我是 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++stringtypescastingmatching

解决方案


任何 C 标准都没有定义像“String”这样的类型。字符串只是一个字符数组,根据所选编码存储为无符号值。'string.h' 提供了用于比较、连接等的各种函数,但它只有在您传递给它的值是一致的情况下才能工作。

运算符“==”对于字符串比较也是未定义的,因为它需要比较每个索引处的每个字符,对于两个可能大小不同并且最终可能使用不同编码的数组,尽管底层无符号整数表示(提高误报比较的可能性)。您可以定义自己的函数来执行此操作(注意 C 不允许重载运算符),但否则您会被标准库提供的内容所困扰。

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

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

作为最后的旁注

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

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


推荐阅读