簡體   English   中英

在C ++中分割字串

[英]Splitting String in C++

我想要的是:

要解析一個MAC地址字符串並獲得六個uint8_t值的數組,其輸入類似於string str = "01:23:45:AB:CD:EF";

我嘗試過的方法(無效):

sscanf(str.c_str(), "%x:%x:%x:%x:%x:%x", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]);

為什么不起作用:我正在Arduino IDE的幫助下為ESP8266 Wi-Fi模塊編程。 即使Arduino開發板的官方核心支持sscanf() ,ESP8266的核心也不支持。 nicjohnston所述, 無法解決 GitHub上給出的問題的解決方案 。)

最不推薦:

占用過多RAM,CPU周期或程序存儲空間的任何內容。
同樣,某些使用sscanfsetjmplongjmp或直接或間接依賴於sscanfsetjmplongjmp (以及其他幾個東西)可能不起作用。

編輯:下面@ms的答案是絕對正確的,但是我意識到在設計自己的代碼之后(如下所示)。

for(uint8_t i=0; i<5; i++)
  mac[i]=strtol(Serial.readStringUntil(':').c_str(),NULL,16);
mac[6]=strtol(Serial.readStringUntil('\n').c_str(),NULL,16);

您可以使用正則表達式提取內容並將其存儲在數組中。 然后解析該數組以獲得相應的uint8_t等效項。

正則表達式可能像: [0-9A-F][0-9A-F]

您可以參考此參考鏈接以獲取有關正則表達式及其使用方法的更多詳細信息: http : //www.cplusplus.com/reference/regex/regex_search/

在C ++中, regex_search允許搜索regex模式,並可能還提取搜索(或匹配)的模式。

在您的特定用例中,您可以簡單地遍歷字符串並將十六進制子字符串轉換為數字,如下所示:

  • 每個子字符串均由兩個十六進制字符組成; 讓子字符串用XY表示
  • XY[0-9][AF] ,其中A 表示 10B表示11等(十進制)
  • 從ASCII值到這些字符之一的數字含義的轉換取決於char來自哪個字符集:

  • 如果char c來自[0-9] ,則其十進制含義為c-'0' ,即減去偏移量,以便以下映射應用'0'=>0, '1' => 1, ...

  • 如果char c來自[AF] ,則映射可以表示為c-'A'+10

  • 然后,每個子字符串XY十進制數字v的計算如下: v=X*16 + Y

  • 子字符串由單個字符分隔(此處為: ,但這無關緊要)

以下代碼實現了這些想法:


#include <string>
#include <cstdlib>

std::uint8_t getNum(char hexChar)
{
    if(hexChar >= '0' && hexChar <= '9')
    {
        return hexChar - '0';
    }
    return (hexChar-'A'+10);
}

int main()
{
    std::uint8_t mac[6];
    std::string str = "01:23:45:AB:CD:EF";

    std::uint8_t j = 0;
    for(std::uint8_t i = 0; i<6; ++i)
    {
        mac[i] = getNum(str[j])*16 + getNum(str[j+1]);
        j+=3; // get to the next substring
    }
}

我來晚了,女士的回答是正確的。

我的答案有點不同,因為它使用來從字符串中計算十六進制,並使它更接近c ++ 11。 雖然我不確定您的ESP8266模塊是否支持它,但希望對您有所幫助。

#include <string>
#include <array>

std::array< uint8_t, 6> MAC_fromStringToArray(const std::string& str)
{
    std::array< uint8_t, 6> ret ;

    for (auto i = 0; i < 6; i++)
    {
        ret[i] = std::stoi(str.substr((i * 3), 2), nullptr, 16);
    }

    return ret;
}

int main()
{
    std::string str = "01:23:45:AB:CD:EF";

    std::array< uint8_t, 6> mac = MAC_fromStringToArray(str);

    return 0;
}

編輯:由於似乎不可用,我將其更改為傳統數組。

uint8_t * MAC_fromStringToArray(const std::string& str, uint8_t arr[])
{
    for (int i = 0; i < 6; i++)
    {
        arr[i] = std::stoi(str.substr((i * 3), 2), nullptr, 16);
    }

    return arr;
}

需要以不同的方式調用它:

uint8_t arr[6]; 

MAC_fromStringToArray(str, arr);

希望有幫助,恐怕如果無法使用與您相同的編譯器,很難解決您的情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM