百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

char「」、char*和string之间的比较和转换

liebian365 2024-10-18 09:30 26 浏览 0 评论


01



char[]和char*之间的比较和转换


在C++编程中,很多时候我们会遇到如何对char[]和char*进行比较,当然一般来说都是通过使用strcmp方法,当然看了C++ primer的话都知道不能使用“==”,那么先看看直接使用“==”是什么样的结果。

如下面的程序:

#includeusing namespace std;
int main() {
    char arrTest1[] = "abc";
    char arrTest2[] = "abc";
    cout << (arrTest1== arrTest2) << endl; 


    char *pTest1 = "abc";
    char *pTest2 = "abc";
    cout << (pTest1 == pTest2) << endl;
}

这个程序的结果是:第一个打出的是0,而第二个打出的是1

问题分析:

那么为什么会有这种结果呢,首先需要知道的是这里“==”比较的不是指向的内容abc,

比较的是各个arrTest1和arrTest2对象中存储的是指向内容的地址,换句话说就是abc的地址,不是它们本身的存储的值。

Array对象

对Array对象来说,是运行时在栈空间上分配的内存,所以每个对象都是单独去申请内存,各自保存一份自己的abc,所以Array对象存储的地址也是不一样的,所以第一个结果是false;

Pointer对象

对Pointer对象来说,两个字符指针并没有分配相应的存储区,是后面的abc是以字符串常量的形式存在常量区,然后把首地址的值赋值给了Pointer对象,所以Pointer对象存储的地址应该来说是一样的,所以第二个结果是true;

我们可以想到通过打印相关的地址来查看结果是否正确,但这里会有个问题:

数组对象下面直接打印数组对象,其实是打印的数组对象的内容,结果都是abc

cout << arrTest1<< endl;
cout << arrTest2<< endl;

对于数组对象可以这样打印数组的首地址,可以从这里看出这两个地址是不同的,即两个abc存储在不同的空间

cout << &arrTest1<< endl;
cout << &arrTest2<< endl;

输出结果如下:

指针对象

下面直接打印指针对象,其实是打印的也是指针对象的内容,结果都是abc,这样打印按道理

来说应该是打印的字符串的首地址,是因为对cout进行了重载,打印字符指针时,给出地址

不是打印地址内容,而是打印相对的字符的内容,所以会得到abc结果

cout << pTest1 << endl; cout << pTest2 << endl;

但是如果取该指针的地址来打印的话,结果两个地址是不对的,因为此时打印的不是指向的字符串的首地址了,而是该指针变量的地址,当然不一样

cout << &pTest1 << endl; cout << &pTest2 << endl;

如果要获取指针对象的字符串的首地址的值的话,需要让cout输出符不认为它是一个字符指针,

这样就不会产生重载操作了,这样可以看到两个输出的地址是相同的

cout << (void*)pTest1<< endl; cout << (void*)pTest2<< endl;

输出结果如图:

那么直接比较char[]时,可以使用如下函数方式:

如果要比较的对象是char*字符串

int strcmp(const char* s1,const char* s2); char a[10]="abc",c[1000]="abc"; printf("%d",strcmp(a,c)); //返回 0 表示相等

2. 如果要比较的对象是两个string,则利用函数compare() 或者 ==

s1.compare(s2)

3. 注意:

C++中string类型与char*类型的字符串比较的一种实例,使用strcmp比较时需先将string转换成char*类型再比较,此时可以用c_str()函数转换。

当然compare其中有一个重载如下,可以直接使用于string与char*或者与char[]进行对比

int compare (const char* s) const;


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


int main(void)
{
    const char *passwd = "ap_passwd";
    string str = "ap_passwd";


    cout<<"passwd="<<passwd<<", str="<<str<<endl;


    if ( str.compare(passwd) == 0)
    {
        cout<<"The compare euqal!"<<endl;
    }
    else
    {
        cout<<"is not equal!"<<endl;
    }


    return 0;
}


运行:
passwd=ap_passwd, str=ap_passwd
The compare euqal!



02

三者之间的转换


三者之间的转换

1. string类如何转换为char *呢?

首先必须了解,string可以被看成是以字符为元素的一种容器。字符构成序列(字符串)。有时候在字符序列中进行遍历,标准的string类提供了STL容器接口。具有一些成员函数比如begin()、end(),迭代器可以根据他们进行定位。

注意,与char*不同的是,string不一定以NULL('\0')结束。string长度可以根据length()得到,string可以根据下标访问。所以,不能将string直接赋值给char*。

把string转换为char* 有3种方法:
1.data
string str="abc";char *p=(char *)str.data();
2.c_str
string str="gdfd";char *p=str.c_str();
3. copy
string str="hello";char p[40];str.copy(p,5,0); //这里5,代表复制几个字符,0代表复制的位置
*(p+5)='\0'; //要手动加上结束符

2.char[]转换为string类

直接赋值即可。

3. string类转换为char[]



char *strcpy(char *a,const char *b)
{
    if(a == NULL || b == NULL)
    exit(0);
    char *c = a;
    while((*a++ = *b++) != '\0');
    return c;
}


char c[20];
string s="1234";
strcpy(c,s.c_str())

相关推荐

“版本末期”了?下周平衡补丁!国服最强5套牌!上分首选

明天,酒馆战棋就将迎来大更新,也聊了很多天战棋相关的内容了,趁此机会,给兄弟们穿插一篇构筑模式的卡组推荐!老规矩,我们先来看10职业胜率。目前10职业胜率排名与一周前基本类似,没有太多的变化。平衡补丁...

VS2017 C++ 程序报错“error C2065:“M_PI”: 未声明的标识符&quot;

首先,程序中头文件的选择,要选择头文件,在文件中是没有对M_PI的定义的。选择:项目——>”XXX属性"——>配置属性——>C/C++——>预处理器——>预处理器定义,...

东营交警实名曝光一批酒驾人员名单 88人受处罚

齐鲁网·闪电新闻5月24日讯酒后驾驶是对自己和他人生命安全极不负责的行为,为守护大家的平安出行路,东营交警一直将酒驾作为重点打击对象。5月23日,东营交警公布最新一批饮酒、醉酒名单。对以下驾驶人醉酒...

Qt界面——搭配QCustomPlot(qt platform)

这是我第一个使用QCustomPlot控件的上位机,通过串口精确的5ms发送一次数据,再将读取的数据绘制到图表中。界面方面,尝试卡片式设计,外加QSS简单的配了个色。QCustomPlot官网:Qt...

大话西游2分享赢取种族坐骑手办!PK趣闻录由你书写

老友相聚,仗剑江湖!《大话西游2》2021全民PK季4月激燃打响,各PK玩法鏖战齐开,零门槛参与热情高涨。PK季期间,不仅各种玩法奖励丰厚,参与PK趣闻录活动,投稿自己在PK季遇到的趣事,还有机会带走...

测试谷歌VS Code AI 编程插件 Gemini Code Assist

用ClaudeSonnet3.7的天气测试编码,让谷歌VSCodeAI编程插件GeminiCodeAssist自动编程。生成的文件在浏览器中的效果如下:(附源代码)VSCode...

顾爷想知道第4.5期 国服便利性到底需优化啥?

前段时间DNF国服推出了名为“阿拉德B计划”的系列改版计划,截至目前我们已经看到了两项实装。不过关于便利性上,国服似乎还有很多路要走。自从顾爷回归DNF以来,几乎每天都在跟我抱怨关于DNF里面各种各样...

掌握Visual Studio项目配置【基础篇】

1.前言VisualStudio是Windows上最常用的C++集成开发环境之一,简称VS。VS功能十分强大,对应的,其配置系统较为复杂。不管是对于初学者还是有一定开发经验的开发者来说,捋清楚VS...

还嫌LED驱动设计套路深?那就来看看这篇文章吧

随着LED在各个领域的不同应用需求,LED驱动电路也在不断进步和发展。本文从LED的特性入手,推导出适合LED的电源驱动类型,再进一步介绍各类LED驱动设计。设计必读:LED四个关键特性特性一:非线...

Visual Studio Community 2022(VS2022)安装图文方法

直接上步骤:1,首先可以下载安装一个VisualStudio安装器,叫做VisualStudioinstaller。这个安装文件很小,很快就安装完成了。2,打开VisualStudioins...

Qt添加MSVC构建套件的方法(qt添加c++11)

前言有些时候,在Windows下因为某些需求需要使用MSVC编译器对程序进行编译,假设我们安装Qt的时候又只是安装了MingW构建套件,那么此时我们该如何给现有的Qt添加一个MSVC构建套件呢?本文以...

Qt为什么站稳c++GUI的top1(qt c)

为什么现在QT越来越成为c++界面编程的第一选择,从事QT编程多年,在这之前做C++界面都是基于MFC。当时为什么会从MFC转到QT?主要原因是MFC开发界面想做得好看一些十分困难,引用第三方基于MF...

qt开发IDE应该选择VS还是qt creator

如果一个公司选择了qt来开发自己的产品,在面临IDE的选择时会出现vs或者qtcreator,选择qt的IDE需要结合产品需求、部署平台、项目定位、程序猿本身和公司战略,因为大的软件产品需要明确IDE...

Qt 5.14.2超详细安装教程,不会来打我

Qt简介Qt(官方发音[kju:t],音同cute)是一个跨平台的C++开库,主要用来开发图形用户界面(GraphicalUserInterface,GUI)程序。Qt是纯C++开...

Cygwin配置与使用(四)——VI字体和颜色的配置

简介:VI的操作模式,基本上VI可以分为三种状态,分别是命令模式(commandmode)、插入模式(Insertmode)和底行模式(lastlinemode),各模式的功能区分如下:1)...

取消回复欢迎 发表评论: