Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;如何解析字符数组(或std::string)中的整数(可能还有双精度)?_C++_Arrays_String_Parsing - Fatal编程技术网

C++ C++;如何解析字符数组(或std::string)中的整数(可能还有双精度)?

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

我正在做一个简单的程序,已经坚持了几天了

如何解析字符数组中的整数(可能还有双精度)? 如果更简单的话,字符数组可以转换成字符串, 我的意思是,它不是一个必须有字符数组

我在寻找一个C++的< < /P>方式>
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
。我