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()?请澄清“它不起作用”。您观察到了什么行为,以及它如何未能满足您的期望?请澄清“它不起作用”。您观察到了什么行为,以及它如何未能满足您的期望?