c++中char[]与char*的转换以及char*与数字互转

2023-05-16

    在c/c++中,字符串操作不可避免,而且通常,char*或者char[]就能表示字符串,这个跟java语言有很大的差别,java中char是字符,string才是字符串,他们是完全不一样的概念。在c/c++中,虽然string也可以表示字符串,但是char*表示字符串还是更常见。

    既然char*和char[]都可以表示字符串,他们之间的转换是如何的呢?另外,如果字符串中都是数字,如何将他们转换为整数或者浮点数,反过来,数字如何转字符串,这个在日常的编程中,都是必须要掌握的技巧。

    先来总结一下char*与char[]的互转:

    一般来说,字符串的表示可以是char*,也可以是char[],这里呢,char*字符指针,表示的虽然是一个指针,但是也是一个字符串,它表示一个以'\0'结束的字符串。char[]表示的虽是一个字符数组,但同样也是一个字符串。

    他们都可以直接赋值:

    char* str = "hello";   这种表示方法是有问题的,如果在vs编辑器中,它会提示"hello"是一个常量,不可修改,需要const修饰符修饰,所以最终它只能表示为const char* str="hello";

     

    char str1[] = "hello";   这种表示法,编译器会认为它也是一个常量,并且给出了长度char str1[6]。这种表示方式,编译器不会强制我们在前面加上const修饰符。

    

    另外,char[]这种表示方法,我们可以直接在声明的时候,就给出长度,比如:

char str[6] = "12345";

    因为字符数组的最后一位需要用'\0'来填充,表示结束符,所以他的长度总是要在字符实际长度的基础上+1,这是一个永恒不变的定律。所以,在字符串拷贝的时候,我们经常见到这样的初始化表达式:  

char* str1 = new char[strlen(str)+1];

    而上面的char str[6] = "12345";字符串表示,之所以长度初始化为6,也就是这个原因了。这个长度,只能设置大,最少设置为刚刚好,多数情况下,我们会设置一个偏大的值,比如20、100等,如果我们不想设置,可以留空,让编译器自己来默认设置,就是如下的表示方式了:

char str[] = "hello,world.";

    这样,编译器会默认将数组长度设置为13。 

    那么问题来了,如果我们不注意,把长度设置小了怎么办? 编译阶段就会报错。

    

    1、  char[]  -> char*    :通过"="直接赋值

char str1[] = "hello";
char* str2 = str1;
cout<<"str1="<<str1<<"\nstr2="<<str2<<endl; 

     2.1、char* -> char*   :借助strcpy()拷贝赋值

const char* str3 = "1234";
char* str4 = new char[strlen(str3)+1];
strcpy(str4,str3);
cout<<"str3="<<str3<<"\nstr4="<<str4<<endl;

    2.2、char* -> char[]     :借助strcpy()拷贝赋值 

const char* str5 = "helloworld";
char str6[11];
strcpy(str6,str5);
cout<<"str5="<<str5<<"\nstr6="<<str6<<endl;

    通过上面的示例,我们知道,如果是char[]->char*,就是直接赋值,如果是char*->char?,就是拷贝赋值,因为无论是char*还是char[],他们都需要先指定一个数组长度进行初始化,然后进行挨个下标拷贝,也就是拷贝赋值。

    其实,都是字符串,为什么这么多讲究,还有这么多区别,我也理解的不是很深入,但是通过这些例子,我自己是明白了。

    接下来,我们来看看字符串转数字的办法:

    1、sscanf()  

//sscanf
char str7[] = "3.1415";
double num7;
sscanf(str7,"%lf",&num7);
cout<<"num7="<<num7<<endl; // 3.1415

    2、strtod()

char str9[] = "24.876543E+001";
double num9;
num9 = strtod(str9,NULL);
cout<<"num9="<<num9<<endl; // 248.765

    3、atof()

//atof
char str8[] = "15.6";
double num8;
num8 = atof(str8);
cout<<"num8="<<num8<<endl; // 15.6

    如果字符串表示的是整数(int类型),还可以通过atoi()方法。

    反过来,数字转字符串:

    1、整数可以通过itoa(),c++中需要改为_itoa()

int i = 999;
char c[4];
_itoa(i,c,10);
cout << "c=" << c << endl;

    再次可以看出,char[]数组长度需要指定一个合适的长度。

    2、sprintf(),格式化,和sscanf()类似,这里是将数字转为字符串。

double num10 = 12.3;
char str10[5];
sprintf(str10,"%.1lf",num10);
cout << "str10=" << str10 << endl;

    这里如果是浮点数转换为字符串,有个问题,就是浮点数的小数点位数和格式化的参数有很大关系,这里不能一概而论,就是sprintf(str10,"%.1lf",num10),其中"%.1lf"是格式化后一位小数,如果是"%.2lf"就是两位小数,以此类推。所以这个格式化不是一个标准的办法。

   3、借助sstream的stringstream字符流工具。

double value;
stringstream ss;
string str;
value = 3.1415;
ss << value;
ss >> str;
cout << "str=" << str << endl;

     个人感觉,c/c++对字符串的操作显然很谨慎,有很多讲究,而在java中,这种操作几乎是无缝对接的。只要他们本身没有大问题,转换都封装好了,Integer.parseInt(str),new String(value)。而在javascript中,这种转换就更加的直接,parseInt(),parseFloat(),数字转字符串就更加简单了,他们直接在数字前面拼接一个""就可以了,比如""+123。

    以上完整代码如下所示:

#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_DEPRECATE)
#define _CRT_SECURE_NO_DEPRECATE
#endif
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main() {
    //=
    char str1[] = "hello";
    char* str2 = str1;
    cout << "str1=" << str1 << "\nstr2=" << str2 << endl;
    //strcpy
    const char* str3 = "1234";
    char* str4 = new char[strlen(str3) + 1];
    strcpy(str4, str3);
    cout << "str3=" << str3 << "\nstr4=" << str4 << endl;
    //strcpy
    const char* str5 = "helloworld";
    char str6[11];
    strcpy(str6, str5);
    cout << "str5=" << str5 << "\nstr6=" << str6 << endl;
    //sscanf
    char str7[] = "3.1415";
    double num7;
    sscanf(str7, "%lf", &num7);
    cout << "num7=" << num7 << endl;
    //atof
    char str8[] = "15.6";
    double num8;
    num8 = atof(str8);
    cout << "num8=" << num8 << endl;
    //strtod
    char str9[] = "24.876543E+001";
    double num9;
    num9 = strtod(str9, NULL);
    cout << "num9=" << num9 << endl;
    //sprintf
    double num10 = 12.3;
    char str10[5];
    sprintf(str10,"%.1lf",num10);
    cout << "str10=" << str10 << endl;
    //ecvt
    /*
    char* str11;
    int dec, sign;
    int dig = 10;
    double num11 = 9.86;
    str11 = _ecvt(num11, dig, &dec, &sign);
    cout << "str11=" << str11 << endl;
    */
    double value;
    stringstream ss;
    string str;
    value = 3.1415;
    ss << value;
    ss >> str;
    cout << "str=" << str << endl;
    return 0;
}

    运行,打印结果如下:

     

    我们可以确定的是,char如果表示字符串是一个以'\0'结束的字符串,长度是真实长度+1。 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c++中char[]与char*的转换以及char*与数字互转 的相关文章

  • "" 和 " " 之间有什么区别,如何根据字符测试前者?

    在Java中 空引号 和 带有单个空格的引号 之间有什么区别以及如何测试前者char 代表空字符串 is not空 它包含一个空格字符 你不能用以下方式来测试前者char 因为没有字符 用 a 来测试它String 它是String长度为零
  • 结构中的字符数组 - 不兼容的赋值? [复制]

    这个问题在这里已经有答案了 我试图找出结构真正的 是什么 并遇到了问题 所以我有两个问题 1 sara 中保存了什么 它是指向结构体第一个元素的指针吗 2 更有趣的问题 为什么它不能编译 GCC 说 test c 10 错误 赋值中的类型不
  • 指向常量字符的指针

    下面的代码指向a中的第一个字符字符数组可在只读存储器中使用 是对的吗 const char ptr String one 现在 当ptr开始指向另一个内存位置 ptr String two 第一个会发生什么字符数组 执行结束时该内存位置是否
  • 使用字符的 for 循环绘制具有特定颜色的多条线

    我想在一张图表上绘制 13 条线 每行代表我的数据的一个子集 按 盆地 列中的字符分组 我所拥有的有效 但我想使用 for 循环使其更有效 输出如下所示 https i stack imgur com gTapP png 可使用的简化数据框
  • 为什么“char **”类型的索引给出整个字符串?

    考虑这个片段 include
  • ChrW(e.KeyCode) 在 C# 中的等价物是什么?

    在VB NET 2008中 我使用了以下语句 MyKeyChr ChrW e KeyCode 现在我想将上面的语句转换成C 有任何想法吗 快速而肮脏的相当于ChrW在 C 中只是将值转换为char char MyKeyChr char e
  • Oracle JDBC 和 Oracle CHAR 数据类型

    我在 Oracle JDBC 驱动程序的处理方面遇到了一个棘手的问题CHAR数据类型 让我们看一下这个简单的表格 create table x c char 4 insert into x c values a inserts a 所以当我
  • 字符类型边界处增量运算符的行为

    我想知道 C 在这种情况下的表现如何 char variable 127 variable 在这种情况下 变量现在等于 128 但是 增量运算符是否将值包装到其下限或是否发生了溢出 发生溢出并导致未定义的行为 第 5 5 节 如果在计算表达
  • 如何在C++中读取一个字节并将字节的ASCII值保存为整数

    我有一个简单的问题让我困惑 Goal 我想从文件中读取给定的字节 比如第一个字节 并用该字节的 ASCII 值创建 int x 因此 例如 如果字节 字符是 a 我希望 x 为 97 十六进制的 61 我有以下读取文件 example tx
  • 尝试在整数后添加字符然后打印结果时出现奇怪的结果

    我正在尝试创建一个简单的欧姆定律计算器 所以我们的想法是你可以填写两个变量 然后它会计算第三个变量 当我创建这个程序时 我发现了一个小问题 我不明白它是如何发生的 不幸的是我无法找到答案 我尝试打印一个显示完整计算的字符串 用户填写的两个变
  • 在 Scala 中有效地重复字符/字符串 n 次

    我想更有效地执行以下操作 def repeatChar char Char n Int List fill n char mkString def repeatString char String n Int List fill n cha
  • 实现 `memcpy()`:需要 `unsigned char *`,还是只需要 `char *`?

    我正在实施一个版本memcpy 能够与它一起使用volatile 使用安全吗char 或者我需要unsigned char volatile void memcpy v volatile void dest const volatile v
  • Java中的字符算术

    在玩的过程中 我遇到了一些对我来说似乎很奇怪的事情 以下不是有效的 Java 代码 char x A x x 1 possible loss of precision 因为其中一个操作数是整数 所以另一个操作数被转换为整数 结果无法分配给字
  • 非法转义字符“\”

    我想在链接末尾获取名称 所以我这样做了 if invName substring j k equals copyf invName substring 0 j Eclipse 说字符串文字没有用双引号正确关闭 如何将字符串与此字符进行比较
  • 为什么C++变量是指针时不需要正确定义?

    我对 C 语言完全陌生 特别是指针 经验主要是 PHP 并且希望对以下内容进行一些解释 我已经尝试寻找答案 这两行代码如何能够在我的程序中完成完全相同的工作 第二行似乎违背了我迄今为止所学到和理解的关于指针的一切 char disk 3 D
  • 如何在c中的某个位置终止字符指针?

    我试图通过设置空终止符来终止 c 中的字符指针 在特定位置 例如 如果我有一个 char 指针 char hi hello 我希望它是 hell 通过设置o为空 我尝试过使用 strcpy 来执行此操作 例如 strcpy hi 4 0 但
  • 将 char 绑定到枚举类型

    我有一段与此非常相似的代码 class someclass public enum Section START MID END vector section Full void ex for int i 0 i section
  • 如何在 C 中将 char 连接到 char* ?

    我怎样才能前置char c to char myChar 我有c值为 A and myChar值为 LL 我怎样才能前置c to myChar使 ALL 这应该有效 include
  • 检查字符串中是否存在所有字符值

    我目前正在做这项任务 但我被困住了 目标是读取文件并查找文件中的字符串中是否存在这些字符值 我必须将文件中的字符串与作为参数放入的另一个字符串进行比较 但是 只要每个字符值位于文件中的字符串中 那么它就 匹配 示例 输入和输出 a out
  • Android - 如何获取文本视图中字符的坐标

    是否可以从 Android 中的 TextView 中的字符获取 x 坐标 我不是在寻找 TextView 本身的坐标 我需要 TextView 中最后一个字符的坐标 多行 提前致谢 Java解决方案 以下是如何获得x and y特定字符的

随机推荐

  • Python中bisect模块用法,及实现方式

    bisect用法 import bisect bisect bisect left t x 在T列表中查找x xff0c 若存在 xff0c 返回x左侧位置 bisect bisect right t x bisect insort lef
  • c++实验六总结(自用)

    实验目的 掌握派生类的声明方法和派生类构造函数的定义方法 掌握不同方式下 xff0c 构造函数与析构函数的执行顺序与构造规则 程序如下 xff1a include lt iostream gt include lt string gt us
  • 光网络知识

    一 WDM网络体系结构注意点 1 波长复用 2 波长转换 3 透明性 4 电路交换 5 生存性 xff1a 当网络出现故障时 xff0c 光路能够自动路由到另一条备份路径上 xff0c 为网络提供了高度的弹性 6 光路拓扑 二 波分复用网络
  • docker镜像更新后 如何正确更新对应的容器 避免数据丢失

    容器的更新大致分为以下两种方法 1 容器并未存储任何应用程序的数据 在这种情况下 您可以在任何时候使用它的更新版本替换APP容器 方法是执行如下所示 span class token function docker span pull my
  • netconn_accept返回值为0,OSQCreate出错 lwip uocsii

    我是在main中有创建信号量的函数 led event 61 OSQCreate amp led q 0 MSGSIZE 这个因为配置中信号量上限较小 而在sys arch c中有一个创建消息邮箱的函数 err t sys mbox new
  • 零基础自学STM32-复习篇2——使用结构体封装GPIO寄存器

    我们首先要了解寄存器的一个特点 xff0c 他不是只针对一个外设 xff0c 而是所有的外设都 就拿GPIO的CRL xff0c ODR寄存器来说 对于GPIOA GPI xff2f E都有一组功能相同的寄存器只是地址不一样而已 xff21
  • 写给小白:使用GitHub来托管论文吧

    使用GitHub来托管论文吧 摘要 xff1a 写给小白 对于非计算机专业的小伙伴 xff0c 可能很少接触到GitHub吧 xff0c 但GitHub真心好用 xff0c 虽然我们不会用它来进行 托管代码 xff0c 但是可以用来托管论文
  • 【软件安装】ElasticSearch在Linux系统中的安装

    0 安装JDK xff0c 并配置环境变量 ElasticSearch依赖Java环境 xff0c 先在服务器上安装好JDK xff0c 并配置好JAVA HOME环境变量 1 从官网下载ElasticSearch压缩包到本地 cd usr
  • Python爬取淘宝商品数据,价值千元的爬虫外包项目

    前言 本文的文字及图片来源于网络 仅供学习 交流使用 不具有任何商业用途 如有问题请及时联系我们以作处理 PS xff1a 如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 完整代码可以点击下方链接获取 python免费学习资
  • argparse简介

    一 argparse简介 argparse 模块是 Python 内置的用于命令项选项与参数解析的模块 xff0c argparse 模块可以让人轻松编写用户友好的命令行接口 xff0c 能够帮助程序员为模型定义参数 argparse定义四
  • Ubuntu22.04安装、配置、美化、软件安装、配置开发环境

    Ubuntu22 04安装 配置 美化 软件安装 配置开发环境 一 Ubuntu Windows11 xff08 10 xff09 双系统安装 因为ubuntu的安装网上的教程特别多了 xff0c 所以这里不做赘述 xff0c 推荐使用小破
  • 直观理解uCOSII中的信号量的作用、优先级翻转现象、互斥信号量对优先级翻转现象的作用

    信号量的作用 优先级翻转现象 uCOS中的特殊信号量 互斥信号量 本文作为一个学习uCOS的经验分享 xff0c 希望能给初学小白们一个参考 以例程和运行效果来说明 xff0c 对一些概念性的东西这里不做过多解释 xff0c 网上相关文章多
  • C语言实现ftp客户端

    在VS2010新建win32控制台空项目 xff0c 加入下面代码 xff1a ftplib h xff1a ftplib h header file for callable ftp access routines Copyright C
  • 查看opencv文件所在目录方式

    查看opencv文件所在目录方式
  • CMake学习(二) —— 链接库的生成

    除使用 add executable 生成可执行文件外 xff0c 还可以使用 add library 生成链接库 一 Linux的链接库 首先讲一下 linux 的链接库 xff0c 就是一些函数代码的二进制形式 xff0c 有动态与静态
  • C/C++信号量CreateSemaphore的用法

    创建或打开命名或未命名的信号量对象 要指定对象的访问掩码 xff0c 请使用CreateSemaphoreEx函数 语法 HANDLE WINAPI CreateSemaphore xff08 In opt LPSECURITY ATTRI
  • Git+Jenkins+docker实现自动部署git拉取代码部署web服务

    Git 43 Jenkins 43 docker的持续集成环境构建 工作步骤思路 xff08 下图所示 xff09 1 server1搭建好git仓库和用docker搭建好docker镜像仓库 2 server3用git命令去别的共用仓库拉
  • 无人机实验平台开发随笔(二)

    困难与解构 xff1a 在实际开发过程中 xff0c 通信问题成为了第一阶段最为严肃的问题 xff0c 在解除了各类与机器人和无人机相关领域的知识之后 xff0c 随着对项目功能认识的深入 xff0c 也逐渐感觉到了强烈的无力感 首先 xf
  • 无人机实验平台开发随笔(三)NOKOV Seeker软件配置

    考虑到在上一篇文章中分析的结论 xff0c 对于nokov和平台核心组件的数据传输反而可以放在相对次要的位置了 xff0c 毕竟就算通过手动输入坐标也是可行的方案 先前对硬件进行的调试 xff0c 有必要进行一个总结 xff0c 公司给予的
  • c++中char[]与char*的转换以及char*与数字互转

    在c c 43 43 中 xff0c 字符串操作不可避免 xff0c 而且通常 xff0c char 或者char 就能表示字符串 xff0c 这个跟java语言有很大的差别 xff0c java中char是字符 xff0c string才