如何使用 stoi,如果字符串在 C++ 中有一个字母,则返回 false?

Posted

技术标签:

【中文标题】如何使用 stoi,如果字符串在 C++ 中有一个字母,则返回 false?【英文标题】:How to use a stoi, and return false if the string has a letter in c++? 【发布时间】:2015-09-18 22:35:39 【问题描述】:

所以,我在C++中有这段代码,需要用stoi来测试String(a)是否有字母,如果没有,将数字发送给int,如果有则返回false。

我的代码

void main()

  string a = "a1321";
  int b;
  if (stoi(a))
    b = stoi(a);
    cout << b << endl;
  
  else cout << "ERROR"<< endl;

  system("pause");


谁能帮忙?

【问题讨论】:

你需要查看stoi如何表示失败:试试en.cppreference.com/w/cpp/string/basic_string/stol 你必须绝对使用 stoi 吗? 【参考方案1】:

由于stoi在解析后返回整数值,因此不能直接使用返回值来检查正确性。

您可以捕获std::invalid_argument 异常,但它可能太多了。如果你不介意使用strol C 函数而不是std::stoi,你可以这样做

bool isNumber(const std::string& str)

  char* ptr;
  strtol(str.c_str(), &ptr, 10);
  return *ptr == '\0';

它利用了函数将第二个char** 参数设置为传递字符串中的第一个非数字字符的事实,对于只包含数字的字符串,它应该是'\0'。

【讨论】:

抱歉我的无知,但是我该如何使用那个“& str”参数呢? 这是对字符串的 const 引用:en.cppreference.com/w/cpp/language/reference stoi 具有相同的第二个参数(它是可选的)【参考方案2】:

你可以这样写函数:

bool try_stoi(int & i, const string & s)
    try 
        size_t pos;
        i = stoi(s, &pos);
        return pos == s.size();
    
    catch (const std::invalid_argument&) 
         return false;
    

【讨论】:

抱歉我的无知,但是我该如何使用“int & i”和“string & s”参数呢? 失败条件太弱——需要使用第二个参数检测尾随非数字字符。 第二次检查,不比较指针内容(字符串包含空字符时可能会失败),比较指针在字符串中的位置。【参考方案3】:

//使用此代码

int main() 
  string a;
  
  cin >> a;
  
  try 
    int b;
    b = stoi(a);
    cout << b;
   
  catch (exception e) 
    cout << "string not converted";
  

  return 0;

【讨论】:

虽然这可能会回答问题,但您应该edit 您的回答包括对如何此代码块回答问题的解释。这有助于提供上下文,并使您的答案对未来的读者更有用。

以上是关于如何使用 stoi,如果字符串在 C++ 中有一个字母,则返回 false?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 stoi() 将字符串转换为整数?

C++ 困境:关于 std::stoi

c++知识点

C++ std::stoi 异常:无效参数

字符串合并处理:C++ bitset库和stoi()函数实践

C++ stoi 有时会发送带空格的异常