在C ++中将字符串解析为double和string
Parsing a string into double and string in C++
我有这样的字符串
string myStr("123ab")
我想将其解析为
double d;
string str;
与 d=123
和 str=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'
但是,它在输入 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;
}
我有这样的字符串
string myStr("123ab")
我想将其解析为
double d;
string str;
与 d=123
和 str=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'
但是,它在输入 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;
}