c++中c_str()及atof()和stod()的用法详细解析

函数作用

 功能:c_str() 函数可以将 const string* 类型 转化为 const char* 类型
头文件:#include<cstring>      

为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。

c_str()就是将C++的string转化为C的字符串数组,c_str()生成一个const char *指针,指向字符串的首地址

1、c_str() 是string的一个方法,返回指向const char的指针,该指针不能修改指向的内容。

2、为什么要用c_str()?

因为有些地方需要用char指针,比如以char指针作为形参的方法。

3、为什么可以用文本常量的字符串赋值给char指针,却不能用字符串变量赋值给char指针?

1     char * cp1 = "hello";  // OK
2 
3     string str = "hello";
4 
5     cp1 = str; // Error,无法从“std::string”转换为“char *”

文本常量字符串赋值给char指针,做的事情如下:

a、为char指针分配内存;

b、为文本常量字符串分配内存;

c、将字符串首地址赋值给char指针。

文本常量字符串赋值给char指针,实际上这里的文本常量字符串表达的意义是首地址。

注意:与文本常量对应的是具名常量。

语法及返回值

语法:

const char *c_str();

返回值:

c_str()函数返回一个指向正规C字符串的指针常量(临时指针), 内容与本string串相同。

使用方法1

注意点:

c_str() 这个函数转换后返回的是一个临时指针,不能对其进行操作
所以因为这个数据是临时的,所以当有一个改变这些数据的成员函数被调用后,该数据就会改变失效;

例如:

#include<iostream>
#include<cstring>
using namespace std;

int main() {
	const char *ptr;
	string s = "12345";
    ptr = s.c_str();
    cout << "s改变前ptr为:" << ptr << endl;
    s = "66666";
    cout << "s改变后ptr为:" << ptr << endl;
    return 0;
}



输出:

s改变前ptr为:12345
s改变后ptr为:66666

输出结果可以看出 s 一变那么 ptr 就会改变;

因此要么直接将这个数据应用或输出,要么把它的数据用 strcpy() 函数复制到自己可以管理的内存中;

如下:

#include<iostream>
#include<cstring>
using namespace std;

int main() {
	char ptr[5];
	string s = "12345";
	strcpy(ptr, s.c_str());
	cout << "s改变前ptr为:" << ptr << endl;
	s = "66666";
    cout << "s改变后ptr为:" << ptr << endl;
	return 0;
} 



输出:

s改变前ptr为:12345
s改变后ptr为:12345

使用方法2

用法1

#include <iostream>
#include <cstring>
using namespace std;
 
int main()
{
	const char *c;
	string s = "1234";
	c = s.c_str(); //c最后指向的内容是垃圾,因为当s对象被析构,其内容被处理,
	               //同时,编译器也将报错——将一个const char *赋与一个char *。
	               //因此要么现用现转换,要么把它的数据复制到用户自己可以管理的内存中
	cout<<c<<endl;
	s = "abcd";
	cout<<c<<endl;
	system("pause");
}



输出:


1234

abcd

如果程序中继续使用c指针,导致的错误是不可预估的。比如:1234变成abcd

用法2:

使用strcpy()函数 等来操作方法c_str()返回的指针 。

更好处理为:

#include <iostream>
#include <cstring>
using namespace std;
 
int main()
{
	//更好的方法是将string数组中的内容复制出来 所以会用到strcpy()这个函数
	char *c = new char[20];
	string s = "1234";
	// c_str()返回一个客户程序可读不可改的指向字符数组的指针,不需要手动释放或删除这个指针。
	strcpy(c,s.c_str());
	cout<<c<<endl;
	s = "abcd";
	cout<<c<<endl;
 delete[]c;//删除自定义数组

	system("pause");
}


输出:

1234

1234
#include<iostream>
#include<string>
#include<cstring>//需要包含cstring的字符串
using namespace  std;

int main()
{
    string strS = "1234";
    int iLen = strS.size() + 1;//size不包含最后的空字符,所以要+1
    char *strC = new char[iLen];
    strcpy_s(strC, iLen,strS.c_str());
    cout << strC << endl;
    strS = "abcde";
    cout << strC << endl;
    delete[]strC;//删除自定义数组

    cin.get();
    return 0;
}

输出:
1234
1234

用法3:

c_str()以char*形式传回string内含字符串

如果一个函数要求char*参数,可以使用c_str()方法:

string s = "Hello World!";
printf("%s", s.c_str()); //输出 "Hello World!"
system("pause");


输出:
Hello World!

atof()函数的用法

1 作用

C++ 中的atof() 函数将字符串的内容解释为浮点数并将其值作为双精度值返回。

2 atof 原型 

double atof(const char* str);

它在<cstdlib> 头文件中定义。

3 参数

  • str- 具有浮点数表示的字符串。

4 返回

atof() 函数返回:

  • 一个双精度值(从字符串转换而来)。
  • 如果无法执行有效转换,则为 0.0。

如果转换后的值超出范围,则会导致未定义的行为。

5 如何使用

#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{
    char numberString[] = "-32.40"; 
    double numberInDouble;
    cout << "Number in  String = " << numberString << endl;

    numberInDouble = atof(numberString);
    cout << "Number in Double = " << numberInDouble;
    
    return 0;
}


输出:
Number in  String = -32.40
Number in Double = -32.4

参考:

C++ atof()用法及代码示例 - 纯净天空

std::stod()函数的用法

在 C++ 中使用 std::stod 将 string 转换为浮点值

   std::stod 函数连同 std::stof 和 std::stold 是由 STL 提供的,用于将 string 转换为浮点数。请注意,我们说的是转换,但它更像是将字符串内容解释为浮点值。也就是说,这些函数使用预定义的解析规则扫描给定的字符串参数,以识别有效的浮点数并将它们存储在相应的类型对​​象中。

        函数通过后缀来区分,后缀表示它们返回的类型。std::stod 对象返回 double 值,std::stof 返回一个浮点数,而 std::stold 返回 long double。这些函数自 C++11 起就成为 STL 的一部分,并包含在 <string> 头文件中。

        在下面的代码片段中,我们将探索不同的转换场景并深入研究这些函数的解析规则。第一个示例是 string 对象仅包含数字和十进制分隔符 (.) 的最简单情况。std::stod 函数将给定的字符序列解释为有效的浮点数并将它们存储在 double 类型中。请注意,十进制分隔符不能是逗号(,)字符,因为它不会被视为数字的一部分。

#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::string;
int main() {
    string str1 = "123.0";
    string str2 = "0.123";
    auto m1 = std::stod(str1);
    auto m2 = std::stod(str2);
    cout << "std::stod(\"" << str1 << "\") is " << m1 << endl;
    cout << "std::stod(\"" << str2 << "\") is " << m2 << endl;
    return EXIT_SUCCESS;
}

输出:

std::stod("123.0") is 123
std::stod("0.123") is 0.123

小结

参考:

c++中c_str()的用法详解_c++ c_str-CSDN博客

C++中的 c_str() 函数-CSDN博客

https://blog.51cto.com/yang/4598579

  • 23
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值