在C ++中将字符串解析为double和string

Parsing a string into double and string in C++

我有这样的字符串

string myStr("123ab")

我想将其解析为

double d;
string str;

d=123str=ab

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

istringstream ss(myStr);
ss >> d >> str;

但是没有用。怎么了?

这对老 strtod 来说似乎是个问题。

char* end;
double d = strtod(string.c_str(), &end);

end 将指向应该形成 str;

char* 数组的开始
str = end; /*uses string& operator= (const char*)*/

然后将相关内容复制到str中。因为它需要一个值副本,所以不用担心 c_str() 会失效。

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

串号; 双 an_number;

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

回答:

string: 9994324.34324324343242
double: 9.99432e+006 

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;
}

$ ./a.out 123ab
In '123ab', double is 123 and string is 'ab'

(Live on coliru.)


但是,它在输入 123<b>e</b>b 时失败,因为 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;
}

(Live on coliru.)