std :: string中的数字

时间:2017-06-26 18:10:40

标签: c++ string c++11 for-loop while-loop

你可以帮我找到字符串中的数字而不使用像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.但我不明白为什么我的while循环不起作用。

4 个答案:

答案 0 :(得分:2)

您循环遍历序列并有条件地将元素复制到另一个容器。标准库具有专门用于此任务的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'; }
);

答案 1 :(得分:1)

  

为什么我不能这样做:

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

这不会起作用,因为如果条件为while,程序将永远执行true语句。您需要使用if而不是while

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

答案 2 :(得分:1)

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

 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值(数字字符)来解密当前字符是否为数字。如果条件为真,使用while循环将使您进入无限循环。这意味着一旦你的迭代达到'3',它将继续坐在while循环中。因此,你的向量将永远调用push_back,因为当前条件已经满足,并且没有基本情况来突破while循环。

修改 这段代码有两个我最初没有抓到的错误。首先,矢量应该是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];
        }
    }
} 

答案 3 :(得分:1)

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);
  }   
}