4

我是 C++ 新手(来自 C# 背景),正在尝试学习如何将字符串转换为 int。

我通过使用 astringstream并将其输出到 a中使其工作double,如下所示:

const char* inputIndex = "5+2";
double number = 0;
stringstream ss(inputIndex);
ss >> number;
// number = 5

这很好用。我遇到的问题是我正在解析的字符串以数字开头,但在数字之后可能有其他非数字字符(例如“5+2”、“9-(3+2)”等) . 解析开头的stringstream数字并在遇到非数字时停止,就像我需要的那样。

当我想知道有多少个字符用于解析数字时,问题就来了。例如,如果我 parse 25+2,我想知道两个字符用于 parse 25,以便我可以推进字符串指针。

到目前为止,我通过清除stringstream、将解析后的数字输入回其中并读取结果字符串的长度来使其工作:

ss.str("");
ss << number;

inputIndex += ss.str().length();

虽然这确实有效,但对我来说似乎真的很糟糕(尽管这可能只是因为我来自 C# 之类的东西),而且我有一种感觉可能会导致内存泄漏,因为它str()会创建字符串的副本。

有没有其他方法可以做到这一点,或者我应该坚持我所拥有的?

谢谢。

4

2 回答 2

6

您可以使用它std::stringstream::tellg()来找出输入流中的当前获取位置。在从流中提取之前将此值存储在变量中。然后从流中提取后再次获取位置。这两个值之间的差异是提取的字符数。

double x = 3435;
std::stringstream ss;
ss << x;

double y;
std::streampos pos = ss.tellg();
ss >> y;
std::cout << (ss.tellg() - pos) << " characters extracted" << std::endl;
于 2011-01-25T02:29:47.613 回答
1

上面使用tellg() 的解决方案将在现代编译器(例如gcc-4.6)上失败。

原因是 tellg() 确实显示了光标的位置,现在超出了范围。参见例如“文件流 tellg/tellp 和 gcc-4.6 这是一个错误吗?

因此,您还需要测试 eof() (意味着消耗了整个输入)。

于 2013-04-16T16:04:38.040 回答