gpt4 book ai didi

c++ - 从 std::string 解析两个或一个数字

转载 作者:行者123 更新时间:2023-11-30 01:16:05 28 4
gpt4 key购买 nike

我一直在设计这个函数:

//Turns "[0-9]+,[0-9]+" into two integers. Turns "[0-9]+" in two *equal* integers
static void parseRange(const std::string, int&, int&);

我无法访问正则表达式(这需要 C++11 或 Boost 库)。我需要以某种方式找出字符串是否包含 2 个整数并将其拆分,然后获取每个整数。

我想我需要 strstr使用 std::string 来确定是否有逗号及其位置的版本。我可能可以使用 std::string::c_str 值进行操作。广泛的搜索让我想到了这个(但我想使用 std::string,而不是 C 字符串):

  void Generator::parseRange(const std::string str, int& min, int& max) {
const char* cstr = str.c_str();
const char* comma_pos;
//There's a comma
if((comma_pos=strstr(cstr, ","))!=NULL) { //(http://en.cppreference.com/w/cpp/string/byte/strstr)
//The distance between begining of string and the comma???
//Can I do this thing with pointers???
//Is 1 unit of pointer really 1 character???
unsigned int num_len = (comma_pos-cstr);
//Create new C string and copy the first part to it (http://stackoverflow.com/q/8164000/607407)
char* first_number=(char *)malloc((num_len+1)*sizeof(char));//+1 for \0 character
//Make sure it ends with \0
first_number[num_len] = 0;
//Copy the other string to it
memcpy(first_number, cstr, num_len*sizeof(char));
//Use atoi
min = atoi(first_number);
max = atoi(comma_pos+1);
//free memory - thanks @Christophe
free(first_number);
}
//Else just convert string to int. Easy as long as there's no messed up input
else {
min = atoi(cstr); //(http://www.cplusplus.com/reference/cstdlib/atoi/)
max = atoi(cstr);
}
}

我在谷歌上搜索了很多。你真的不能说我没试过。上面的函数有效,但我更喜欢一些不那么天真的实现,因为你在上面看到的是旧时代的硬核 C 代码。这一切都依赖于没有人搞砸输入这一事实。

最佳答案

您可以通过使用 std::stringstd::atoi 提供的内置搜索工具来完成此操作,而无需复制或使用 mallocnew 来存储部分字符串。

#include <cstdlib>
#include <string>

void Generator::parseRange(const std::string &str, int& min, int& max)
{
// Get the first integer
min = std::atoi(&str[0]);

// Check if there's a command and proces the second integer if there is one
std::string::size_type comma_pos = str.find(',');
if (comma_pos != std::string::npos)
{
max = std::atoi(&str[comma_pos + 1]);
}
// No comma, min and max are the same
else
{
max = min;
}
}

或者正如其他人指出的那样,您可以使用 std::istringstream处理整数解析。这将允许您在解析整数值时进行额外的输入验证

#include <sstream>
#include <string>

bool Generator::parseRange(const std::string& str, int& min, int& max)
{
std::istringstream sst(str);

// Read in the first integer
if (!(sst >> min))
{
return false;
}

// Check for comma. Could also check and error out if additional invalid input is
// in the stream
if (sst.get() != ',')
{
max = min;
return true;
}

// Read in the second integer
if (!(sst >> max))
{
return false;
}

return true;
}

关于c++ - 从 std::string 解析两个或一个数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27349806/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com