![](/img/trans.png)
[英]function which takes a string as input and returns the most frequent character
[英]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 函數strtok
或strtok_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.