std :: string中的数字

Digits in std::string

本文关键字:数字 string std      更新时间:2023-10-16

您可以帮助我在字符串中找到数字而不使用Isdigit这样的功能吗?我只能用于循环和指针。如果我有

std::string s {"A year has 365 days"}

为什么我不能这样做这样的事情:

for (int i=0; i<s.size(); i++){
    while (s[i]>='0' && s[i]<='9) v[i].push_back(s[i]);
}

我知道这将在矢量中存储3 6和5的数字,而不是数字365。但是我不明白为什么我的时循环不起作用。

您正在通过序列循环,并将元素复制到另一个容器。标准库具有专门用于此任务的std::copy_if算法。

std::string s{ "A year has 365 days" };
std::vector<char> v;
std::copy_if(s.begin(), s.end(), std::back_inserter(v), ::isdigit);

如果您坚持不使用isdigit,则可以提供自己的谓词(此示例中的lambda(。

std::copy_if(s.begin(), s.end(), std::back_inserter(v),
    [](char ch) { return '0' <= ch && ch <= '9'; }
);

如果我正确理解您,您只想存储数字?如果是这样,也许您正在寻找这样的东西:

 string s = "A year has 365 days";
 vector<string> storedNums = {};
 for(int i = 0; i < (s.length() - 1); i++) {
    if (s[i] >= 48 && s[i] <= 57) {
        storedNums.push_back(s[i]);
    }
}

在这里,我使用的是48至57(数字字符(之间的ASCII值,如果当前字符是数字,则使用。如果条件为真,则使用时循环将使您进入无限循环。这意味着一旦您的迭代达到" 3",它将继续坐在循环中。因此,您的向量将永远呼叫push_back,因为满足了当前状态,并且没有基本案例可以突破时循环。

编辑:该代码有两个我最初没有捕获的错误。首先,向量应为vector<char>,而不是vector<string>。其次,我注意到条件不应是i < s.length()-1,应该是i < s.length()。我最初键入的方式跳过了循环中的最后一个索引,并且可以与给定的字符串一起使用,但是如果从字符串中取出" days" ,它将仅打印36。以下代码已调整以确保可读性,并已编译以确保其有效:

// Example program
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
    string s = "A year is 365";
    vector<char> nums;
    int length = s.length();
    for(int i = 0; i < length; i++) {
        if (s[i] >= '0' && s[i] <= '9') {
            nums.push_back(s[i]);
            cout << s[i];
        }
    }
} 

为什么我不能这样做这样的事情:

for (int i=0; i<s.size(); i++){
    while (s[i]>='0' && s[i]<='9') v[i].push_back(s[i]);
}

如果条件是true,该程序将永远执行while语句。您需要使用whileif fnstead。

for (int i=0; i<s.size(); i++)
{
   if (s[i]>='0' && s[i]<='9')
   {
      v[i].push_back(s[i]);
   }
}
std::string str {"A year has 365 days"};   
std::vector<char> vec;   
for(const char c: str)   
{
  if (c>='0' && c<='9')
  {
    vec.push_back(c);
  }   
}