将字符串的小节转换为 int c++

Posted

技术标签:

【中文标题】将字符串的小节转换为 int c++【英文标题】:convert subsection of a string to int c++ 【发布时间】:2015-03-01 14:15:47 【问题描述】:

我有一个如下所示的字符串:

水平分级:4

我将整行存储为字符串,并且可以使用 linestring[30] 之类的方法访问数字 4,其中 linestring 是整行存储为的字符串。我试图以整数而不是字符串的形式访问数字 4。我怎样才能做到这一点?我曾尝试使用 atoi(linestring[30].c_str());但这不喜欢对线串有参数。我无法使用 boost 等外部库。我该怎么做?

【问题讨论】:

【参考方案1】:

使用substr 代替operator[]。它会给你另一个std::string,而不是char。然后使用std::stoi将字符串转换为整数。

或者,使用从operator[] 返回的char 创建一个新的std::string 以应用std::stoi

在 C++11 之前的版本中,使用 std::istringstream 而不是 std::stoi

顺便说一句,远离atoi。如果"0" 应该是有效输入,则无法进行错误检查。

【讨论】:

【参考方案2】:

对于更通用的方法,您在表单中有对:

foo: <number>

你可以这样使用:

std::string s = "Horizontal Binning: 4";

size_t pos = s.find_last_of(':');
if(pos != std::string::npos)

    int num;
    std::stringstream(s.erase(0, pos + 1)) >> num;
    std::cout << "num = " << num << std::endl;

else // give error here

【讨论】:

find_last_of 在这里可能会更好:)【参考方案3】:

你可以使用

int value = atoi(linestring.c_str() + 30);

但您必须确保字符串至少有 30 个字符,否则这将意味着未定义的行为。

【讨论】:

完美,我应该先阅读有关 atoi 命令的更多信息。谢谢 如果输入是 "Horizontal Binning: 0" 并且错误检查应该检测到像 "Horizontal Binning: x" 这样的错误输入,这将不起作用,因为 atoi 为转换错误返回 0。所以没有办法区分有效零和由转换错误引起的零。 这是可以接受的,因为分箱始终是一个 > 0 的值【参考方案4】:

如果您不知道数字前的文本有多长,您可以简单地循环直到找到一个数字并从那里调用 atoi:

auto it = begin(str);
while (it != end(str) && !isdigit(*it))
    ++it;
cout << atoi(&*it) << endl;

【讨论】:

【参考方案5】:

由于这是 C++ 并且您使用的是 std::string,因此请使用 stoi 而不是 atoi。这是一个受Innocent Bystander 的回答启发的通用解决方案。

找到:在字符串中的位置,然后解析int:

size_t start = linestring.find_last_of(':') + 1;
int i = std::stoi(linestring.substr(start));

你甚至可以把它做成单线。


或者如果你知道这个数字永远只有一位,而且它是字符串中的最后一个字符:

int i = linestring.back() - '0';

【讨论】:

【参考方案6】:

另一个选项是sscanf,它尝试匹配一个模式:

#include <cstdio>
#include <string>

void Extract(const std::string& s) 
    int value = 0;
    int r = sscanf(s.c_str(), "Horizontal Binning: %d", &value);
    if (r == 1) 
        printf("value is %d\n", value);
     else 
        printf("cannot extract value\n");
    


int main() 
    Extract("Horizontal Binning: 4");
    Extract("Whatever: 4");

输出是:

value is 4
cannot extract value

【讨论】:

以上是关于将字符串的小节转换为 int c++的主要内容,如果未能解决你的问题,请参考以下文章

将字符串转换为 int (C++)

c++ 不使用 C 标准库将字符串和 int 转换为 char*

使用 ostringstream 或 stringstream 将 C++ Int 转换为字符串

(c++) 将 int 转换为 char 指针(int 是 int 形式的字符)

c++,stl。将具有 rgb 颜色的字符串转换为 3 个 int 值?

将字符串转换为整数部分 C++ [关闭]