簡體   English   中英

function 將字符串作為輸入並將其拆分為單詞。 標點符號應該被忽略

[英]function which takes a string as input and splits it into words. Punctuation characters should be ignored

我寫了一個功能,但彈出一個錯誤。 我不知道如何解決它。 總的來說,我在清盤的實施中是否適當地采取了行動?

void Split(char* str) 
{
    const char* punctuation = "~`!@#$%^&*()-_+=,./?;:'";
    char* ch = strtok(str, punctuation);

    while (ch) 
    {              
        std::cout << ch << '\n';
        ch = strtok(0, punctuation);
    }
}

錯誤 - 嚴重性代碼描述項目文件行抑制 State 錯誤 C4996 'strtok':此 function 或變量可能不安全。 考慮改用 strtok_s。 要禁用棄用,請使用 _CRT_SECURE_NO_WARNINGS。 詳細信息請參見在線幫助。

您可以在文件頂部定義_CRT_SECURE_NO_WARNINGS ,如下所示。

#define _CRT_SECURE_NO_WARNINGS

或者代替strtok ,嘗試使用strtok_s並查看這個 cppreference 鏈接

我更喜歡 C++11 而不是 C 函數strtokstrtok_s的基於正則表達式的標記化:

void split(const std::string& s)
{
   std::regex rgx("[~`!@#$%^&*()-_+=,./?;:']+");
   std::sregex_token_iterator iter(s.begin(), s.end(), rgx, -1);
   std::sregex_token_iterator end;
   for ( ; iter != end; ++iter)
      std::cout << *iter << std::endl;
}

IMO,它要好得多,因為它可以與 char arrays (C 字符串)的std::string一起使用。

一個簡單的用例:

std::string s("some`string?to+-be;:'tokenized");
split(s);

現場演示在這里


請注意,這將為子匹配創建std::string對象,這可能代表一些開銷(盡管可能通過短字符串優化而減少)。 這個問題討論了如何將子匹配轉換為std::string_view對象:迭代正則表達式子匹配表示為 std::basic_string_view

重寫循環形式的解決方案可能如下所示:

for ( ; iter != end; ++iter)
{
   std::string_view sv(&*iter->first, iter->length());
   std::cout << sv << std::endl;
}

暫無
暫無

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

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