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

文章目录

    • 函数作用
    • 语法及返回值
    • 使用方法1
    • 使用方法2
    • atof函数的用法
    • std::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");
}输出:1234abcd

如果程序中继续使用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");
}输出:12341234
#include<iostream>
#include<string>
#include<cstring>//需要包含cstring的字符串
using namespace  std;int main()
{string strS = "1234";int iLen = strS.size() + 1;//size不包含最后的空字符,所以要+1char *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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/39757.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

app单页下载页源码带管理后台

新版带后台管理APP应用下载页,自动识别安卓苹果下载页&#xff0c;带管理后台&#xff0c;内置带3套App下载模板带中文模板/英文模板随时切换。 app单页下载页源码带管理后台

nginx 配置文件location块中符号的含义

nginx -t 检查配置文件语法问题 nginx -s reload 重新加载conf文件 location 块 表示精确匹配 ~ 这个符号开头表示区分大小写 * 一般和 ~ 公用, ~* 表示不区分大小写 ^ 表示正则的开始 前缀匹配&#xff1a;默认的匹配方式&#xff0c;不带修饰符&#xff0c;匹配…

自动装配在Spring框架中的原理与实现方式

自动装配在Spring框架中的原理与实现方式 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 自动装配的概念与背景 在Spring框架中&#xff0c;自动装配&#x…

告别PS修图,设计师都在用的AI抠图工具

引言 大家好&#xff01;如果你是美工或设计师&#xff0c;肯定深知Photoshop修图的繁琐和耗时。现在有一款超方便的工具&#xff0c;让你摆脱这些问题——千鹿设计助手。它不仅是个抠图工具&#xff0c;还能通过先进的AI技术&#xff0c;让抠图变得简单快速&#xff0c;让你专…

[Leetcode 128][Medium] 最长连续序列

目录 题目描述 整体思路 具体代码 题目描述 原题链接 整体思路 首先看到找连续升序排序的最长序列长度&#xff0c;想到对数组进行排序预处理。但是排序算法时间复杂度需要O(nlogn)&#xff0c;题目要求时间复杂度为O(n)。因此不能进行排序与处理 接着想到数据结构哈希表&a…

Laravel 文件操作全指南:上传与下载实践

Laravel 提供了一系列强大的工具来简化文件上传和下载的过程&#xff0c;使得在 Web 应用程序中处理文件变得更加容易和安全。本文将详细介绍如何在 Laravel 中实现文件的上传和下载&#xff0c;包括表单创建、路由设置、控制器逻辑以及安全性考虑。 文件上传基础 文件上传是…

为什么网上商店需要翻译成其他语言

网上商店不仅仅是一个可以买到商品的网站。它是一个完整的电子商务平台&#xff0c;为来自世界各地的用户提供购买所需物品的机会。但是&#xff0c;为了让这些用户舒适地使用网站&#xff0c;需要高质量的翻译和本地化。 本地化是指产品或服务适应特定文化或市场的过程。它包…

问题 P: 表达式树的值

问题 P: 表达式树的值 题目描述 读入表达式树的先序遍历字符串&#xff0c;求其值。运算符只可能是加减乘除&#xff0c;保证输入的每个子表达式树的结果都是整数值且可以用C语言的int类型表达。 输入 输入由多组测试数据组成。 每组数据包含一行字符串&#xff0c;即表达式…

Nginx详解-安装配置等

目录 一、引言 1.1 代理问题 1.2 负载均衡问题 1.3 资源优化 1.4 Nginx处理 二、Nginx概述 三、Nginx的安装 3.1 安装Nginx 3.2 Nginx的配置文件 四、Nginx的反向代理【重点】 4.1 正向代理和反向代理介绍 4.2 基于Nginx实现反向代理 4.3 关于Nginx的location路径…

CSS 文本输入框右下角的尺寸控件(三斜线:-webkit-resizer)消除,以及如何配置其样式,添加 resize 让标签元素可进行拖拽放大。

前言&#xff1a;在日常的前端开发中&#xff0c;不管是原始的和 还在在各类组件库中的文本输入框中&#xff0c;元素内容的右下角总是有一个三斜线的样式&#xff0c;本文简单了解它是什么&#xff1f;如何去控制并修改样式&#xff1f; 一、它是&#xff1f; 这三个斜线其实…

echarts实现3D柱状图(视觉层面)

一、第一种效果 效果图 使用步骤 完整实例&#xff0c;copy就可直接使用 <template><div :class"className" :style"{height:height,width:width}" /> </template><script>import echarts from echartsrequire(echarts/theme/…

leetcode基础算法刷题汇总

前言 总结算法刷题的一些模板和刷题规律。 目录 单调栈并查集滑动窗口前缀和 & HASH差分拓扑排序字符串二分查找BFSDFS动态规划贪心算法字典树

Python面向对象编程:派生

本套课在线学习视频&#xff08;网盘地址&#xff0c;保存到网盘即可免费观看&#xff09;&#xff1a; ​​https://pan.quark.cn/s/69d1cc25d4ba​​ 面向对象编程&#xff08;OOP&#xff09;是一种编程范式&#xff0c;它通过将数据和操作数据的方法封装在一起&#xff0…

Qt通过句柄获取其它进程控件实例

1.通过spy获取想要获取控件的句柄id 通过spy获取另一个软件的文本框的句柄 2.Qt写代码&#xff0c; 根据句柄获取文本框的内容 void getTextFromExternalWindow(HWND hwnd) {const int bufferSize 256;TCHAR buffer[bufferSize];// 获取窗口文本内容int length GetWindowT…

一文读懂企业为什么需要数字工厂管理系统

在当今这个日新月异的数字化时代&#xff0c;企业面临着前所未有的挑战与机遇。为了在激烈的市场竞争中保持领先地位&#xff0c;实现高效、灵活、可持续的生产运营&#xff0c;企业纷纷转向数字化转型&#xff0c;而数字工厂管理系统作为其中的关键一环&#xff0c;正逐步成为…

京东e卡怎么用?

京东618过去后&#xff0c;就没有多大购物欲望了&#xff0c;最后导致我手里还有好几张200块钱面值的e卡没地方用 本来说送朋友&#xff0c;但是又感觉面值太小了 最后还是在收卡云上把提取出来了&#xff0c;主要回收价格不错&#xff0c;而且到账也快&#xff0c;很方便

VMware配置Ubuntu

VMware下载官方链接&#xff1a;Download VMware Workstation Player | VMware Ubuntu20.04下载&#xff1a;https://ubuntu.com/download/desktop 安装步骤 点击【浏览】可更改安装位置&#xff08;建议不要安装在C盘&#xff0c;可以在D盘或其它磁盘下新建一个“ubuntu”文…

linux深度deepin基于rsync和apt-mirror同步软件源及构建本地内网源

目录 一、rsync方式二、apt-mirror方式1.安装apt-mirror2.配置apt-mirror(/etc/apt/mirror.list)3.新建存放目录开始下载 3.发布mirror站点 一、rsync方式 参考官方文档地址&#xff1a; https://www.deepin.org/index/docs/wiki/05_HOW-TO/08_%E9%95%9C%E5%83%8F%E5%8A%A0%E9%…

国产高边开关驱动芯片替换ST VN7010

RAMSUN提供代理的类比HD7008Q车规级单通道智能高边驱动主要应用于汽车12V接地负载应用中&#xff0c;例如座椅加热&#xff0c;并可以提供进一步的智能保护功能&#xff0c;包括负载过流限制保护、动态过温保护以及过热关断保护等。输入控制引脚兼容3V和5V CMOS接口&#xff0c…

【CSS】深入浅出CSS过渡

CSS过渡&#xff08;Transitions&#xff09;是一种使元素在更改其样式时能够平滑过渡的CSS特性。它允许元素从一种样式逐渐改变为另一种样式&#xff0c;为网页添加动态效果和交互性。下面我们将深入浅出地介绍CSS过渡。 1. 基本概念 过渡属性&#xff1a;你想要过渡的CSS属…