【问题标题】:How to split numbers in string correctly?如何正确拆分字符串中的数字?
【发布时间】:2014-01-29 21:35:06
【问题描述】:

我的输入格式:

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。

如何获得所有数字?

【问题讨论】:

  • 我刚刚在 ideone 中运行了这个,得到了所有 9 个整数,打印了两次,每个在单独的行上:ideone.com/lvzTpq
  • @notch,你是否也在输出结束时得到 572?我相信那是因为 getline 在 61 结尾处将换行符(“\n”)添加到分段字符串。如果根本没有出现,也许 getline 不知道返回,因为它没有收到空格(“” ) 也不是换行符 ("\n")
  • Derek 的输入在 61 之后添加了换行符。getline 不关心 \n,还删除了分隔符。
  • 是的,我在输出的末尾也得到了 572,我们可以做些什么来解决?

标签: c++ string split numbers


【解决方案1】:

我不知道为什么您的实现不适用于您提供的输入 - Derek 在 cmets 中显示应该可以工作。它理解错误的任何额外字符都将被您的程序解释为数字,因此如果有一些隐藏的输入(制表符、换行符、点而不是逗号等),它应该输出垃圾而不是 61,而不是什么都没有。

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

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

【讨论】:

    【解决方案2】:

    怎么样:

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

    【讨论】:

    • 不错! ,但是当用户输入输入时,输出不正确
    • 你可以把第一行改成std::string input; std::cin &gt;&gt; input;就可以了。
    • 我试过了,但是输出只是变成了192、21、4。所以,在空格被忽略后
    • 您可以在输入上执行input.erase(remove_if(input.begin(), input.end(), isspace), input.end()); 来解决这个问题。
    【解决方案3】:

    如果在 61 之后不输入空格(“”),getline 将不会返回,因此永远不会打印 61。如果您指定分隔符,它不会在收到换行符(“\n”)时返回。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-08
      • 1970-01-01
      相关资源
      最近更新 更多