C++ C++;如何解析字符数组(或std::string)中的整数(可能还有双精度)?
我正在做一个简单的程序,已经坚持了几天了 如何解析字符数组中的整数(可能还有双精度)? 如果更简单的话,字符数组可以转换成字符串, 我的意思是,它不是一个必须有字符数组 我在寻找一个C++的< < /P>方式>C++ C++;如何解析字符数组(或std::string)中的整数(可能还有双精度)?,c++,arrays,string,parsing,C++,Arrays,String,Parsing,我正在做一个简单的程序,已经坚持了几天了 如何解析字符数组中的整数(可能还有双精度)? 如果更简单的话,字符数组可以转换成字符串, 我的意思是,它不是一个必须有字符数组 我在寻找一个C++的< < /P>方式> sscanf(mystring, "di %lf %lf %lf", &d1, &d2, &d3); 问题是,我将有多行未知长度(数字)。 我会用空格、逗号或其他东西来分隔数字 代币在路上吗?我对此一无所知 简单C++分析器通常看起来像这样… struct sy
sscanf(mystring, "di %lf %lf %lf", &d1, &d2, &d3);
问题是,我将有多行未知长度(数字)。
我会用空格、逗号或其他东西来分隔数字
代币在路上吗?我对此一无所知
<谢谢你的帮助。 < P>简单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" );
}
}
结构语法错误:std::runtime错误{
语法错误(char const*str):std::runtime错误(str){}
};
std::istringstream iss(str);//str是char*;对std::string使用str.c_str()
字符串操作码;
长双参数[args_max];
iss>>操作码;//读到空白处
用于(大小参数=0;参数<参数计数[操作码];++参数){
如果(iss>>args[arg_cnt]){//读取数字,则放弃前面的空白
抛出语法错误(“参数太少”);
}
炭粉;
如果(!(iss>>delim)| | delim!=','){
抛出语法错误(“预期的”、“分隔符”);
}
}
> p>简单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" );
}
}
结构语法错误:std::runtime错误{
语法错误(char const*str):std::runtime错误(str){}
};
std::istringstream iss(str);//str是char*;对std::string使用str.c_str()
字符串操作码;
长双参数[args_max];
iss>>操作码;//读到空白处
用于(大小参数=0;参数<参数计数[操作码];++参数){
如果(iss>>args[arg_cnt]){//读取数字,则放弃前面的空白
抛出语法错误(“参数太少”);
}
炭粉;
如果(!(iss>>delim)| | delim!=','){
抛出语法错误(“预期的”、“分隔符”);
}
}
我不太确定您真正需要什么。听起来你好像不知道 了解文件的确切格式。(你当然没有 描述了任何“精确的”。)转换整数或双精度 从字符串中,您应该使用
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
行,在上面使用。我不太确定您真正需要什么。听起来你好像不知道 了解文件的确切格式。(你当然没有 描述了任何“精确的”。)转换整数或双精度 从字符串中,您应该使用
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
行,在上面使用。看一看,我认为它正是你想要的。链接中的示例:
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);
}
}
...
}
intmain(intargc,char*argv[])
{
使用boost::词法转换;
使用boost::bad_词法_cast;
std::向量args;
而(*++argv)
{
尝试
{
args.push_back(词汇投射(*argv));
}
捕捉(错误的词汇投射&)
{
参数推回(0);
}
}
...
}
看一看,我想它正是你想要的。链接中的示例:
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);
}
}
...
}
intmain(intargc,char*argv[])
{
使用boost::词法转换;
使用boost::bad_词法_cast;
std::向量args;
而(*++argv)
{
尝试
{
args.push_back(词汇投射(*argv));
}
捕捉(错误的词汇投射&)
{
参数推回(0);
}
}
...
}
看看这个问题及其所有答案:有很多info@Mat好吧,我已经看完了那个页面,花了我1.5个小时,但不幸的是,这不是我需要的。我有一个字符数组(C样式‘char *’或C++‘string’),从中我需要数字。不管怎样,谢谢你。我是基于这个问题来制定我自己的解决方案的。看看这个问题和其中的所有答案:有很多info@Mat好吧,我已经看完了那个页面,花了我1.5个小时,但不幸的是,这不是我需要的。我有一个字符数组(C样式‘char *’或C++‘string’),从中我需要数字。不管怎样,谢谢。我是基于这一点来制定我自己的解决方案的。对不起,我不清楚。我有一个win32编辑控件,我可以从中使用函数GetWindowText(hwnedit1,szBuffer,100)提取行代码>。我一接到电话,就需要电话号码。谢谢你的回复。我无法让滑雪分离器工作。包括以下标题:#include#include#include#include#include#include#include
,和source>>std::ws代码>,source.peek()
,mySeparators.begin()
,source.get()代码>报告错误…首先,我显然输入错误:ostream
的所有事件都应该是istream
。这将解释编译器在源代码上找不到任何函数的原因。它应该找到mySeparators.begin()
,但是,如果您包含
(如果您没有,它应该抱怨mySeparators
)的声明。好的,将ostream更正为istream,现在就好了。但是,begin()
和end()
仍在抱怨:错误C2228:left of'.begin'必须有class/struct/union
和错误C2228:left of'.end'必须有class/struct/union
。MSDN说begin()属于基本字符串:basic\u string::begin
,您可以通过
标题获得它。其中包括:#include#include#include#include#include#include
。我