如何正确拆分字符串中的数字?

时间:2014-01-29 21:35:07

标签: c++ string split numbers

我的输入格式:

  

192,21,4 33,2,1 23,7,61

我只想获得数字。

#include <iostream>
#include <string>
#include <sstream>
#include <cmath>
using namespace std;

int strtoint(const std::string str){      //converting the string to integer
    float a = str.length();
    int result = 0;
    for(int i=1; i<=str.length(); i++){
            result+=(str[i-1]-'0')*pow(10,(a-1));
            a--;
    }
    return result;
}

int main ()
{
  string name;
  string segment;
  while(getline (cin,name, ' ')){
        stringstream test(name);
        while(getline(test, segment, ','))
            {
              cout << segment <<" "<<strtoint(segment)<<endl;
            }
  }
  return 0;
}

我没有获得最后一个(61)。所以输出是192 21 4 33 2 1 23 7。

我如何获得所有数字?

3 个答案:

答案 0 :(得分:1)

我不知道为什么你的实现不适用于你提供的输入 - Derek在评论中表明应该有效。它理解错误的任何额外字符都会被程序解释为数字,所以如果有一些隐藏的输入(制表符,换行符,点而不是逗号等),它应该输出垃圾而不是61,而不是什么。

我会使用其他方法来分割字符串,而不是使用getline。主要是因为getline意味着它读取整行,因此其他人很难理解你实际做了什么。请参阅此主题以了解如何拆分字符串:Split a string in C++?

解析数字时,一旦遇到意外字符(例如“a”),就会遇到问题。有更好,更简单的方法来解析数字:How to parse a string to an int in C++?

答案 1 :(得分:1)

怎么样:

int main()
{
    std::string input = "192,21,4 33,2,1 23,7,61";  
    std::stringstream lineStream(input);    

    std::vector<int> numbers;
    std::string number;

    while (std::getline(lineStream, number, ','))
    {
        numbers.push_back(atoi(number.c_str()));
    }

    for (int n : numbers)
    {
        std::cout << n << " ";
    }
}

答案 2 :(得分:0)

如果您在61之后没有输入空格(&#34;&#34;),则getline将不会返回,因此永远不会打印61.收到换行符后它不会返回(&#34; \ n&# 34;)如果你指定一个分隔符。