Parsing 在C++;

Parsing 在C++;,parsing,c++11,stringstream,Parsing,C++11,Stringstream,我有一根这样的绳子 string myStr("123ab") istringstream ss(myStr); ss >> d >> str; 我想把它分解成 double d; string str; 带有d=123和str=ab 我试着像这样使用字符串流 string myStr("123ab") istringstream ss(myStr); ss >> d >> str; 但它不起作用。怎么了?这看起来像是好老的strod的问

我有一根这样的绳子

string myStr("123ab")
istringstream ss(myStr);
ss >> d >> str;
我想把它分解成

double d;
string str;
带有
d=123
str=ab

我试着像这样使用字符串流

string myStr("123ab")
istringstream ss(myStr);
ss >> d >> str;

但它不起作用。怎么了?

这看起来像是好老的
strod的问题

char* end;
double d = strtod(string.c_str(), &end);
end
然后将指向应构成
str
char*
数组的开头

str = end; /*uses string& operator= (const char*)*/
然后将相关内容复制到
str
。因为它需要一个值拷贝,所以不必担心
c_str()
会失效


(请注意,如果
字符串
不包含前导数字部分,则
d
将设置为零)。

这对于好的
strtd
来说似乎是个问题

char* end;
double d = strtod(string.c_str(), &end);
end
然后将指向应构成
str
char*
数组的开头

str = end; /*uses string& operator= (const char*)*/
然后将相关内容复制到
str
。因为它需要一个值拷贝,所以不必担心
c_str()
会失效

(注意,如果
string
不包含前导数字部分,则
d
将设置为零)。

字符串编号; 双倍数字

number="9994324.34324324343242";
an_number=atof(number.c_str());
cout<<"string: "<<number<<endl;
cout<<"double: "<<an_number;
cin.ignore();
字符串编号; 双倍数字

number="9994324.34324324343242";
an_number=atof(number.c_str());
cout<<"string: "<<number<<endl;
cout<<"double: "<<an_number;
cin.ignore();

OP中的代码按照我的预期工作:

#include <iostream>
#include <sstream>
#include <string>

int main(int argc, char** argv) {
    for (int i = 1; i < argc; ++i) {
        std::istringstream ss(argv[i]);
        double d;
        std::string s;
        if (ss >> d >> s)
            std::cout << "In '" << argv[i]
                      << "', double is " << d
                      << " and string is '" << s << "'\n";
        else
            std::cout << "In '" << argv[i]
                      << "', conversion failed.\n";
    }
    return 0;
}
()


但是,在输入
123eb
时失败,因为
e
被解释为指数指示器,并且没有后续指数。使用
std::istringstream
解决这个问题没有简单的方法,它的工作原理有点像
sscanf
;回退是不可能的。但是,
std::strod
应该找到最长的有效浮点数,因此能够处理
123eb
。例如:

#include <iostream>
#include <sstream>
#include <string>
#include <cstring>

int main(int argc, char** argv) {
    for (int i = 1; i < argc; ++i) {
        char* nptr;
        double d = strtod(argv[i], &nptr);
        if (nptr != argv[i]) {
            std::string s;
            if (std::istringstream(nptr) >> s) {
                std::cout << "In '" << argv[i]
                          << "', double is " << d
                          << " and string is '" << s << "'\n";
                continue;
            }
        }
        std::cout << "In '" << argv[i]
                  << "', conversion failed.\n";
    }
    return 0;
}
#包括
#包括
#包括
#包括
int main(int argc,字符**argv){
对于(int i=1;i>s){

std::coutOP中的代码对我来说工作正常:

#include <iostream>
#include <sstream>
#include <string>

int main(int argc, char** argv) {
    for (int i = 1; i < argc; ++i) {
        std::istringstream ss(argv[i]);
        double d;
        std::string s;
        if (ss >> d >> s)
            std::cout << "In '" << argv[i]
                      << "', double is " << d
                      << " and string is '" << s << "'\n";
        else
            std::cout << "In '" << argv[i]
                      << "', conversion failed.\n";
    }
    return 0;
}
()


但是,它在输入
123eb
时失败,因为
e
被解释为指数指示器,并且没有以下指数。使用
std::istringstream
无法简单解决此问题,它的工作方式有点像
sscanf
;回退是不可能的。但是,
std::strtod
应该可以找到最长的有效浮点数,因此将能够处理
123eb
。例如:

#include <iostream>
#include <sstream>
#include <string>
#include <cstring>

int main(int argc, char** argv) {
    for (int i = 1; i < argc; ++i) {
        char* nptr;
        double d = strtod(argv[i], &nptr);
        if (nptr != argv[i]) {
            std::string s;
            if (std::istringstream(nptr) >> s) {
                std::cout << "In '" << argv[i]
                          << "', double is " << d
                          << " and string is '" << s << "'\n";
                continue;
            }
        }
        std::cout << "In '" << argv[i]
                  << "', conversion failed.\n";
    }
    return 0;
}
#包括
#包括
#包括
#包括
int main(int argc,字符**argv){
对于(int i=1;i>s){

std::cout@Abhinav。谢谢,但这并没有回答问题。@新手,我没有提供答案。我刚刚格式化了answer@Abhinav.谢谢,但这并没有回答问题。@新手,我还没有提供答案。我刚刚格式化了答案谢谢,但它不应该是string.c_str()?谢谢,但它不应该是string.c_str()?请澄清“它不起作用”。您观察到了什么行为,以及它如何未能满足您的期望?请澄清“它不起作用”。您观察到了什么行为,以及它如何未能满足您的期望?