char *与uint8_t的字符串比较

时间:2018-09-01 15:38:14

标签: c++ string types casting matching

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

变量我正在通过:

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') {

我如何尝试匹配:

from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen('http://www.pythonscraping.com/pages/page3.html').read()
soup = BeautifulSoup(html, 'lxml')
table = soup.find('table',{'id':'giftList'})

rows = table.find_all('tr')

for row in rows:
    data = row.find_all('td')

    if (len(data) > 0):
        cell = data[0]
        print(cell.text)

我已经用几种不同的方式来解决这个问题,并做了一些搜索。我知道这两种类型中的一种或两种可能是错误的类型,但是我不确定从自己的工作地点出发。

2 个答案:

答案 0 :(得分:1)

任何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)为止。

答案 1 :(得分:0)

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

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

str1和str2是保存为空终止字符串的内存地址。返回值零表示字符串相等。

您的情况之一:

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