这个问题在这里已有答案:
我是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”类型。字符串只是一个字符数组,根据所选的编码存储为无符号值。 'string.h'提供了各种用于比较,连接等的函数,但它只有在传递给它的值是连贯的时才有效。
对于字符串比较,运算符“==”也是未定义的,因为它需要比较每个索引处的每个字符,对于两个可能不同大小的数组,最终可能使用不同的编码,尽管有相同的基础无符号整数表示(提高)误报比较的前景)。您可以定义自己的函数来执行此操作(注意C不允许重载运算符),但是否则您会遇到标准库提供的问题。
请注意,strncmp()为要比较的字符数采用size参数(您的代码缺少此代码)。 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的情况下)。
要匹配两个字符串,请使用strcmp
:
if (0==strcmp(str1, str2))
str1和str2是保存空终止字符串的内存的地址。返回值零表示字符串相等。
在你的情况下,其中一个:
if (0==strcmp(list[i].ssid, AP_Match))
if (0==strcmp(list[i].ssid, "MatchString"))