簡體   English   中英

沒有從std :: string到int的適當轉換

[英]no suitable conversion from std::string to int

我試圖使用標准C庫的某些功能,但出現此錯誤:沒有從std :: string到int的適當轉換。 我剛剛開始從C語言學習C ++。請不要用困難的術語過度解釋這件事。

#include <iostream>
#include <string> 
#include <cctype>

using namespace std; 

int main(void)
{
  string s1{ "Hello" }; 
  bool what{ isalnum(s1) }; 
  return 0; 
} 

isalnum告訴您單個字符而不是整個字符串是否為字母數字。

如果要檢查字符串是否為字母數字,則需要使用循環查看每個字符:

bool what = true;
for (unsigned char ch : s1) {
    if (!std::isalnum(ch)) {
        what = false;
        break;
    }
}

或算法:

#include <algorithm>

bool what = std::all_of(s1.begin(), s1.end(), 
    [](unsigned char ch){return std::isalnum(ch);});

如評論中所述,使用字符分類功能時,即使它們看起來做起來很簡單,也存在許多並發症和死亡陷阱。 我認為我的示例避免了大多數,但要謹慎行事。

我要發布此內容,以便C ++實現此功能的方法也位於此處。 我更喜歡這種方式,因為它對全局狀態的依賴性較小

std::locale locale; // grab the current global locale locally, may lock
bool what = true;
for (auto ch : s1) {
    if (!std::isalnum(ch, locale)) {
        what = false;
        break;
    }
}

和算法方式:

#include <algorithm>
#include <locale>
#include <functional>

std::locale locale; // grab the current global locale locally, may lock
auto isalnum = std::bind(std::isalnum<char>, std::placeholders::_1, locale);
bool what = std::all_of(s1.begin(), s1.end(), isalnum);

注意:您必須將std::isalnum模板專門化為char因為否則std::bind也不知道它的綁定是什么。

暫無
暫無

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

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