将一个字符串转换为双精度浮点数和整数。如何操作?

5

我遇到了将字符串转换为双精度浮点数的问题。 我的字符串是使用“string”函数声明的,所以我的字符串是:

string marks = "";

现在我想将它转换为double类型,我在互联网上找到了使用word.c_str()的方法,于是我这样做了。我调用了它并像这样使用:

doubleMARK = strtod( marks.c_str() );

这与我在网上找到的示例类似:
n1=strtod( t1.c_str() );

显然,这就是做法。但当然,它并不起作用。我需要另一个参数。我认为是一个指针?但此时我迷失了方向,不知道该怎么做。需要一个地方来存储值或其他什么吗?

我还需要将这个字符串转换成整数,但我尚未开始研究如何实现,一旦我找到方法并出现错误,我会编辑并在此处发布。


1
你查看了 strtod() 的文档吗? - Greg Hewgill
没有,但我会立即开始做。 - Robolisk
3个回答

11

你不使用 std::stodstd::stoi 的原因是什么?它们至少比脆弱的strtod强9个级别。

示例

#include <iostream>
#include <string>

int main() {
  using namespace std;
  string s = "-1";
  double d = stod(s);
  int i = stoi(s);
  cout << s << " " << d << " " << i << endl;
}

输出

-1 -1 -1

如果你必须使用 strtod,那么只需将第二个参数传递为 NULL。根据cplusplus.com的说法:

如果[第二个参数]不是空指针,则该函数还会将endptr指向数字后的第一个字符。

而它并不需要是非 NULL 的。


@Robsta 是的,我只是在这里从 SO 上了解到它们。您可以单击答案中函数名称以转到每个函数的文档页面。如果您无法解密文档,请告诉我,我会给出一个示例。 - Seth Carnegie
@J.F.Sebastian 非常感谢,我从不介意别人编辑我的答案以改进它们。 - Seth Carnegie
我碰巧喜欢 strtod() :) - paulsm4
那么,这个代码示例解释了很多问题。谢谢你,看来你不需要我提到的指针了。感谢你花费时间。 - Robolisk
std::stoistd::strto[u]l 的包装器,而 std::stodstd::strtod 的包装器(请参见标准第21.5节“数字转换”)。 - Tobias
显示剩余5条评论

2
在 C 语言的那个时代,我会做一些丑陋和不安全的事情,比如这样:
char sfloat[] = "1.0";
float x;
sscanf (sfloat, "%lf", &x);

在C++中,你可能会像这样做:
// REFERENCE: http://www.codeguru.com/forum/showthread.php?t=231054
include <string>
#include <sstream>
#include <iostream>

template <class T>
bool from_string(T& t, 
                 const std::string& s, 
                 std::ios_base& (*f)(std::ios_base&))
{
  std::istringstream iss(s);
  return !(iss >> f >> t).fail();
}

int main()
{
  int i;
  float f;

  // the third parameter of from_string() should be 
  // one of std::hex, std::dec or std::oct
  if(from_string<int>(i, std::string("ff"), std::hex))
  {
    std::cout << i << std::endl;
  }
  else
  {
    std::cout << "from_string failed" << std::endl;
  }

  if(from_string<float>(f, std::string("123.456"), std::dec))
  {
    std::cout << f << std::endl;
  }
  else
  {
    std::cout << "from_string failed" << std::endl;
  }
  return 0;
} 

个人而言,我推荐这个链接:

http://bytes.com/topic/c/answers/137731-convert-string-float

有两种方法。C语言提供了strtod函数,可以在char数组和double之间进行转换:

// C-ish: 
input2 = strtod(input.c_str(), NULL);

C++流提供了与各种类型之间的良好转换。要使用字符串和流,请使用stringstream:
// C++ streams: 
double input2;
istringstream in(input); 
input >> input2;

1
这个。这也帮了很多忙。哥们,谢谢你的时间和贡献,我很感激 (: - Robolisk

1
我们可以定义一个stringTo()函数,
#include <string>
#include <sstream>

template <typename T>
T stringTo(const std::string& s) {
  T x;
  std::istringstream in(s);
  in >> x;
  return x;
}

然后,像这样使用它
std::cout << stringTo<double>("-3.1e3") << " " << stringTo<int>("4");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接