c++如何从字符数组(或std::string)解析整数(可能还有双精度)
C++ how to parse integers (and possibly doubles) from character array (or std::string)?
我正在做一个简单的程序,现在已经坚持了几天了。
如何解析整数(和可能的双精度)从字符数组?如果简单的话,char数组可以转换为字符串,我的意思是,它不是必须的字符数组。
我正在寻找一种c++方式
sscanf(mystring, "di %lf %lf %lf", &d1, &d2, &d3);
问题是,我将有多个未知长度(数字)的行。我会用空格,逗号或者其他东西来分隔数字
令牌在路上吗?我对此一无所知。
好的,谢谢你的帮助。
我不太确定你到底需要什么。听起来你不知道了解文件的确切格式。(你当然没有描述任何"确切"的东西。)转换整数或双精度从一个字符串,你应该使用istringstream
。如果你想要支持各种分隔符,您可以轻松编写一个操作符来完成它,类似于:
class skipSeparators
{
std::string mySeparators;
public:
skipSeparators( std::string const& separators )
: mySeparators( separators )
{
}
friend std::ostream&
operator>>(
std::ostream& source,
SkipSeparators const& manip )
{
source >> std::ws;
int next = source.peek();
if ( next != EOF
&& std::find( mySeparators.begin(),
mySeparators.end(),
static_cast<char>( next )
) != mySeparators.end() ) {
source.get();
}
return source;
}
};
有了这个,你可以这样写:
while ( input >> skipSeparators( ",;" ) >> someDouble ) {
// process some double...
}
如果知道行结束的位置很重要,可以阅读文件使用getline()
,并为每个文件创建一个istringstream
简单的c++解析器通常看起来像这样…
struct syntax_error : std::runtime_error {
syntax_error( char const *str ) : std::runtime_error( str ) {}
};
std::istringstream iss( str ); // str is char*; use str.c_str() for std::string
std::string opcode;
long double args[ args_max ];
iss >> opcode; // read up to whitespace
for ( size_t arg_cnt = 0; arg_cnt < arg_counts[ opcode ]; ++ arg_cnt ) {
if ( iss >> args[ arg_cnt ] ) { // read number, discard preceding whitespace
throw syntax_error( "too few args" );
}
char delim;
if ( ! ( iss >> delim ) || delim != ',' ) {
throw syntax_error( "expected ',' delimiter" );
}
}
看看Boost的lexical_cast
,我认为它完全符合您的要求。示例来自链接:
int main(int argc, char * argv[])
{
using boost::lexical_cast;
using boost::bad_lexical_cast;
std::vector<short> args;
while(*++argv)
{
try
{
args.push_back(lexical_cast<short>(*argv));
}
catch(bad_lexical_cast &)
{
args.push_back(0);
}
}
...
}
相关文章:
- 我可以信任表示整数的浮点或双精度来保持精度吗
- C 字符串返回字符串的整数/双精度/长整型值
- 如何防止双精度值到整数的隐式转换
- 野牛/flex:计算器将双精度值解释为整数,所以我添加了 YYSTYPE 双精度 #define 但我有多个编译错误
- 为什么输出是整数而不是双精度?
- 从字符串转换为双精度和整数 - C++
- 从双精度转换为整数的显式类型是否始终检查整数溢出?
- C++,遇到将双精度转换为整数的问题
- 用双精度除以整数
- 使用整数初始化列表初始化长双精度的向量
- 如何判断 c++ 向量中的值类型(整数或双精度)?
- 了解双精度转换与整数转换中的整数与截断关系
- 为什么使用 int64_t 会产生错误的结果,而双精度则按预期进行简单的整数乘法
- 将双精度与整数进行比较
- 64 位整数到双精度冲突
- 在编译时将整数和分数部分宏组合成一个新的宏或双精度
- 不确定输出双精度或整数的代码行
- 将 32 位浮点数和不强制转换的 32 位整数与双精度进行比较,当其中一个值可能太大而无法完全适合另一种类型时
- 使用 sprintf 格式化负整数/双精度
- 在c++中是否有一种方法可以将这种格式的输入限制为整数/双精度