c ++ split int value string

时间:2017-11-20 07:34:48

标签: c++ parsing split

我试图用几种不同的方式分割特定的字符串。我输入的示例是(-5,3,0,1,-2)

这是我的第一个代码,

// code 1
string s = "(-5,3,0,1,-2)";
int j = 0;
int * temp = new int[s.length()];
for (int i = 0; i < s.length(); i++) {
    if (s[i] != '(' && s[i] != ',' && s[i] != ')') {
        temp[j++] = (s[i]-'0');
    }
}

代码1效果很好,除了它将-符号转换为ascii值(45)而非负int值。

//code2
char *first = _strdup(s.c_str());
char * temp2 = NULL;
char *temp = strtok_s(first, "(,)", &temp2);
/* Expected output is
temp[0] = -5
temp[1] = 3
temp[2] = 0
temp[3] = 1
temp[4] = -2
*/

然而,在调试的中间,temp包含ascii值,而不是字符串值。也不确定code2是否正常工作。

谢谢你的进步!

5 个答案:

答案 0 :(得分:1)

你需要一个适当的字符串来进行int转换。使用std::stoi。我使用了boost tokenizer。这对你的情况非常方便。

#include <string>
#include <boost/tokenizer.hpp>
#include <vector>

using namespace std;
using namespace boost;

int main() {
    vector<int> intList
    string text = "(-5,3,0,1,-2)";
    char_separator<char> sep(",");
    tokenizer<char_separator<char>> tokens(text, sep);
    for (const auto& t : tokens) 
          intList.push_back(std::stoi(t));

}

PS。你忘记了删除你的新内容。请使用合适的容器(例如std::vector)。

答案 1 :(得分:0)

使用istrstream :: get方法。您可以通过替换它们来避免打开和关闭括号。

void _parse_(istrstream &str,string &strText, char ch = ',')
{
    char chText[MAX_PATH];
    str.get(chText, MAX_PATH,ch);
    str.get(ch);
    strText = chText;
}

string s = "(-5,3,0,1,-2)";
istrstream inputStream(s);
string sTemp;

//Replace here the open and close braces.

do
{
   _parse_(inputStream, sTemp,',');
   //Your value in sTemp

}while(!sTemp.empty())

答案 2 :(得分:0)

如果您需要使用没有任何库的c ++,您可以使用流动代码:

#include <string>
#include <vector>

using namespace std;
int main()
{
    string s = "(-5 2,3 0 1, 0 , 1 , -21 0 )";
    int location = 0;
    vector<int> array;
    string sub;
    while (location <= s.length())
    {
        if ((s[location] >= 48 && s[location] <= 57) || s[location] == 45 || s[location] == 32)
        {
            if (s[location] != 32)
            {
                sub += s[location];
            }
        }
        else
        {
            if (sub.length() != 0)
            {
                std::string::size_type sz;
                int num = stoi(sub, &sz);
                array.push_back(num);
            }
            sub.clear();
        }
        location++;
    }
    return 0;
}

答案 3 :(得分:0)

#include <sstream>
#include <iomanip>

using namespace std;

const string INTEGER_CHARS {"0123456789+-"};

vector<int> readIntFromString(const string src) {
    const char stopFlag{'\0'};
    const string str {src + stopFlag};

    vector<int> numbers;

    stringstream ss(str);
    int tmp;
    for(char nextChar = ss.peek(); nextChar != stopFlag; nextChar = ss.peek()) {
        if (INTEGER_CHARS.find(nextChar) != string::npos) {
            ss >> setbase(0) >> tmp;
            numbers.push_back(tmp);
        } else {
            ss.ignore();
        }
    }
    return numbers;
}

setbase(0):使>>运算符可以识别其他基数,例如0b010700xF

ss.ignore():跳过我们不需要的字符

答案 4 :(得分:-1)

您可以使用以下内容

string s = "(-5,3,0,1,-2)";
int j = 0;
string temp;
std::vector<int> values;
for (int i = 0; i < s.length(); i++) 
{
    if (s[i] != '(' && s[i] != ')') 
    {
        while (s[i] != ',' && s[i] != ')')
        {
            temp += s[i];
            ++i;
        }
        values.push_back(std::atoi(temp.c_str()));
        temp.clear();
    }
}