首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么c_str()会打印两次字符串?

在C++中,c_str()函数用于将一个std::string对象转换为一个C风格的字符串(一个以空字符('\0')结尾的字符数组)。这个函数通常在需要将C++字符串传递给其他C风格函数时使用。

关于为什么c_str()会打印两次字符串,这可能是因为在使用c_str()函数时,您可能在同一行中连续调用了两次std::cout。例如:

代码语言:cpp
复制
std::string str = "Hello, World!";
std::cout<< str.c_str()<< std::endl<< str.c_str()<< std::endl;

在这个例子中,c_str()函数被调用了两次,因此输出将包含两个字符串。

如果您只想打印一次字符串,只需调用c_str()一次:

代码语言:cpp
复制
std::string str = "Hello, World!";
std::cout<< str.c_str()<< std::endl;

这将只输出一次字符串。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

string和c_str()使用时的坑

这个运行的结果和我们理解的是不会有差距.对于经验丰富的开发者可能微微一笑,但是对于一个刚刚学习的人就开始疑惑了....这里主要说两个问题: 1、声明了一个string实例,使用c_str()进行赋值后,可以正常输出c_str()的值,但是直接输出string实例的实现,实际是空字符串 2、在第一个问题后,对string...实例进行字符串追加,然后对string和c_str()进行输出.原来对字符串变量被覆盖了....在string类中,c_str()的生命周期受到string类实例的影响.如果我们使用string对象实例进行赋值,字符串被复制到一个char*的成员变量,然后在调用c_str()的时候,直接返回string....新对字符串会覆盖老的字符串.使用c_str()打印的时候也是新的char*成员指向的地址.这样也就解释了在使用append对实例赋值时,后面打印的结果是追加字符串的值.

86020
  • 【C++】深度剖析string类的底层结构及其模拟实现

    为什么第10行这里打印就崩了呢,不是返回一个空指针吗?那就打印空指针啊。 ,这里不是这样的,这里程序挂掉的原因就在于对返回的空指针解引用了。 为什么解引用?...这里返回的是const char*类型的指针,我们说cout是自动识别类型,它这里字符串的形式去打印,也就是说它不是打印这个指针,而是去解引用打印它指向的字符串,遇到\0,停止,而这里返回的是空指针...哎,那如果我们用标准库里的string,这里挂掉吗? 我们看到这里就没事了,只是第一个什么都没打印,因为s本身就是构造了一个空字符串对象。 所以这个地方是第一个问题,需要我们解决。...另外,除了析构两次,这种浅拷贝的情况如果我们修改一个string对象是不是也影响另一个啊,因为它们指向同一块空间。...当然这里不能用out<<c_str()去打印,这个我们之前也讲了: 打印c_str返回的const char*的指针,它是遇到’\0’就停止了。所以大家可以理解成c_str就是返回C格式字符串

    25010

    【C++】STL 容器 - string 字符串操作 ③ ( string 字符串 与 char* 字符串转换 | string#c_str() 成员函数 | string#copy() 成员函数 )

    文章目录 一、string 字符串 与 char* 字符串转换 1、string 与 char* 转换 2、string 转为 char* - c_str() 成员函数 3、string 转为 char...string 字符串 , 就是 基于 char* 字符串 创建一个 string 字符串 ; 2、string 转为 char* - c_str() 成员函数 在 C++ 语言中的 std::string...类中 , 封装了一个 c_str() 成员函数 , 用于返回一个指向字符串内容的常量字符指针 ; 将 string 转为 char* 类型 , 就需要调用 c_str() 成员函数 ; c_str()...函数的原型如下 : const char* c_str() const; c_str() 函数 返回一个指向字符串内容的常量字符指针 , 该指针可以用于与C语言库函数进行交互 , 例如使用 printf...() 函数打印字符串 ; 代码示例 : string s1 = "123456789"; // 将 string 转为 char* const char* s2 = s1.c_str();

    1.2K10

    c++标准模板库

    2.为什么学习string类?   ...3.1.类对象的修改操作 函数名称功能说明   在字符串后尾插字符c   append   在字符串后追加一个字符串   +=   在字符串后追加字符串str   c_str   返回C格式字符串   ...c_str   我们发现fopen函数只支持const char*类型(即C语言格式的字符串)的数据,此时就可以用c_str来转换。   ...这个时候我们就发现问题了,s1和s2在类里面定义的指针都指向了同一块空间,当程序结束时,s2析构函数释放空间,s1空间又释放了一次空间,一块空间被释放了两次,造成了程序崩溃。   ...前面我们说过new失败抛异常,那你失败就失败吧,但空间已经被你释放了,所以这段代码还要再优化一下。

    52010

    【C++】string的模拟实现

    C_str const char* C_str()//返回const char*类型的指针 { return _str; } 返回const char*类型的指针相当于返回字符串...,对于内置类型完成值拷贝或者浅拷贝 若使用编译器自动生成的拷贝构造就会报错 ---- s2与s3发生浅拷贝,导致两个指针都指向同一块空间,一个修改影响另一个,析构两次空间 ---- 深拷贝 创建一块同样大小的空间...赋值 赋值运算符也是默认成员函数,如果不写进行浅拷贝/值拷贝 三种情况 正常赋值会存在以下是那种情况 若为第一种两者空间大小相同,则进行值拷贝 若为第二种s1的空间远大于s2的空间,进行值拷贝浪费空间..._size += len; } 通过reserve类似扩容的操作,扩大了字符串长度的空间,并且在原字符串'\0'的位置开始拷贝str字符串 11....(),因为C_str()返回的是一个字符串,遇见'\0'就会结束,但若打印结果有好几个'\0',则遇见第一个就会结束,不符合预期 16.

    42420

    VL53L0X激光测距传感器.Mind+使用篇

    我第一次用这个,写个打印语句看看 ? 可以选择打印方式 ? 这个积木在旁边 ? 右边的代码区,可以看到 ? 点这个地方上传 ? 死循环输出 ? 选择一个tof传感器 ?...这个地方是打印测量的结果,用string强行转换了类型 https://blog.csdn.net/qq_33375598/article/details/88045851 const char *c_str...(); c_str()函数返回一个指向正规C字符串的指针常量, 内容与本string串相同....这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。...1.c_str是一个内容为字符串指向字符数组的临时指针; 2.c_str返回的是一个可读不可改的常指针; 注意:一定要使用strcpy()函数 等来操作方法c_str()返回的指针 ?

    1.4K30

    【C++】STL简介 及 string的使用详解

    那这里的begin呢,返回指向字符串第一个字符的迭代器。 end返回指向最后一个字符后面位置的迭代器。...所以,如果我们想打印一个string对象,就可以有这样两种方式: 你可以认为c_str返回的指针就类似于这里的指针p: 那这里第一个打印其实调的是string重载的<<: 第二个调的就是库里面的那个...为什么呢? 因为第一种方式我们直接打印string对象s1,它是去看s1对应的size 的,size是多大,总共有多少字符,全部打印完。...但是我们第二种打印c_str返回的const char*的指针,它是遇到'\0'就停止了。所以大家可以理解成c_str就是返回C格式字符串。 所以这次就有差异了。...我们输入的是hello world,但是为什么打印s出来只有hello啊,怎么回事?

    11810

    我们说 TCP 是流式协议究竟意味着什么?

    “,接收端收到后将其打印出来。...类似这样的代码在本机一般工作的很好,接收端也如期打印出来预料的字符串,但是一放到局域网或者公网环境就出问题了,即接收端可能打印出来字符串并不完整;如果发送端连续多次发送字符串,接收端会打印出来的字符串不完整或出现乱码...不完整的原因很好理解,即对端某次收到的数据小于完整字符串的长度,recvBuf 数组开始被清空成 \0,收到部分字符串后,该字符串的末尾仍然是 \0,printf 函数寻找以 \0 为结束标志的字符结束输出...;乱码的原因是如果某次收入的数据不仅包含一个完整的字符串,还包含下一个字符串部分内容,那么 recvBuf 数组将会被填满,printf 函数输出时仍然寻找以 \0 为结束标志的字符结束输出,这样读取的内存就越界了...有的面试官可能这么问:网络通信时,如何解决粘包、丢包或者包乱序问题?

    2.7K52

    题目1003:A+B ---c_str(),atoi()函数的使用;remove , erase函数的使用

    ()函数返回一个指向正规C字符串的指针, 内容与本string串相同. 16 int b = atoi(strB.c_str()); //atoi()会将字符串转换为整型数 17...()的用法: 语法: const char *c_str(); c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同....这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。...,不能对其进行操作 再举个例子 c_str() 以 char* 形式传回 string 内含字符串 如果一个函数要求char*参数,可以使用c_str()方法: string s = "Hello...扫描参数nptr字符串,跳过前面的空格字符,直到遇上数字或正负号才开始做转换,而再遇到非数字或字符串时('\0')才结束转化,并将结果返回。

    772100

    用好collections模块,对李白诗集进行字频统计

    1、从一个计数问题开始 初学Python的人很可能遇到字频统计这样的练习题,那么很容易会想到使用for循环来做。 可是for循环的效率是很低的,而且涉及到嵌套循环,代码及其冗余。...比如给定一个字符串,对字母进行计数统计: Python is a popular programming language 一般这样写: my_str = "Python is a popular programming...language" def str_count(strs): '''对字符串进行字频统计,使用字典的get方法进行判断''' str_dict = {} for i in strs...c_str = ','.join(c_list) # 使用Counter进行字频统计 c_cnt = Counter(c_str) # 去除符号、'...c_cnt[i] # 使用most_common方法提取频次最高的前10字符 c_top_10 = c_cnt.most_common(10) # 打印

    37330

    C++:String类的使用

    ,比如打印,我们总是认为这个字符串读取到\0结束的 但是过于依赖\0也会有一系列的问题: 1、如果我是一个很长的字符串,但是中间有几个/0,那么我很难直接打印出来全部的字符串,因为访问到\0就会卡住...string类有很多版本 为什么string要有这么多版本呢??原因是这样的: C语言最早都是由老美发明的,他们研究出了ascii码表 为什么要发明这个东西呢??...综上,要尽量使用成员函数的swap 2.5 string类对象的操作(operations) 1、c_str(重点) 返回一个指向C类型的字符串指针,下面介绍他的用处: 我们可以观察到,s1.c_str...()返回的其实是一个char*指针,但是为什么打印出来的不是地址呢??...类后他有了自己的size,所以根据size去打印,因此是可以打印出\0的,但是>>还是跟之前的scanf一样,默认以换行或者是空格作为标识,如果我们想打印出有空格的字符串,是行不通的!!

    15810

    【C++】string类接口的了解和使用

    为什么我们要学string类呢?那是必须是为了方便啊!...在C语言中,我们创建一个字符串,有很多操作或者必须要注意的细节会把控不住,所以C++中出现了string类,让我们应对字符串等oj题也方便快捷了许多!...= s1.end()) { cout << *it1 << " "; //打印每一个内容 ++it1; } cout << endl; } 可以看的出:operator[]有两个接口...----  3.capacity 1.size,lenth,max_size,capacity 在string中,我们怎么描述字符串长度??length是不是更贴合,那为什么又有size呢??...,substr find:也有缺省值,默认不提供,直接找到最后一个 c_str:取出C形式字符串(底层指针) substr:取出str的一部分,再将其构建成新对象返回

    52920

    CC++字符串函数

    目标字符串dest必须以空字符 \0 结尾,因为strcat从目标字符串的空字符位置开始复制源字符串。...比较时,先进行比较第一个,第一个相同再比较第二个,第二个相同比较第三个,知道找到不同的为止。...十一、c_str——字符串转换字符数组 在C++中,c_str()是string类的一个成员函数,它返回一个指向以空字符终止的字符数组的指针,该数组包含与string对象相同的序列。...函数原型: const char* std::string::c_str() const; 用法为字符串名.c_str(),返回一个字符串的指针。...注意事项: c_str()返回的是const char*类型的指针,这意味着你不能修改通过c_str()获取的字符串内容。 只要string对象存在,c_str()返回的指针就是有效的。

    3710

    C++ string库 resize坑

    所以认为resize()后性能很好,很棒棒的人,就别这样做了, 不仅不会优化性能还会降低以及后面一连串错误,比如c_str(),data()不能达到预期。...并且如果string当前的size()小于resize()值 之后,c_str()返回的会是一个空值, data()方法也不能返回预期的值。...原因是resize()后会重新分配一份内存, c_str()返回的依然是旧内存的地址(可能), 有人误人子弟说这时该data()方法来获取,我试了也不行。...具体就是说resize,如果当前resize值大于当前字符串size()值,就会增加字符串的长度,然后调用append是在新增长度末尾增加的,实际测得确实如此....如果小于当前值,就是截断当前字符串. 最后强烈建议还是别用resize() 缺点太多未知隐患太多,不是很懂能不用就不用.

    1.3K30

    【C++】string类(常用接口)

    insert insert就是插入,不过插入时会进行数据的挪动,尽量少使用,否则效率变低。...不过尽量少用,因为也降低效率。 replace 上面是把从第5个位置开始的,前一个和前三个位置用来替换字符串。位置不够时会挪动,位置够的地方就会替换。...c_str 在C++中,string对象后面会自动加上'\0'来兼容C语言,c_str的作用是返回C格式的字符串。...如上图,filename是string对象,fopen的操作数是字符类型的,所以就要用c_str进行转换。 find substr的作用是在str中从pos位置开始,截取n个字符,然后将其返回。...to_string、stod to_string是把数值转换成字符串,stod是把字符串转换成双精度浮点数。上面还有各种字符串和数值相互转换的函数。

    12310

    萌新不看会后悔的C++string字符串常用知识点总结

    前言 前面学习字符串的时候简单说了string字符串和C风格字符串的不同,今天来详细的学习一下string字符串 过去学习C的时候,想要使用字符串应该是如下的格式: char a[] = “hello...world”; //这里省略了\0,但编译器我们自动添加并隐藏 再高级一点: char * b = “hello world”; 输入字符串: scanf("%s", a);//很多C初学者常犯的一个错就是给..., a); 别问我为什么不使用strcat(a,b);因为程序炸。...'\0'不确定 cout << c << endl; cout << ca << endl; c_str()函数返回一个以’\0’结尾的字符串,而data()没有标准,查看两个函数定义: ?...return pointer to null-terminated nonmutable array 指明c_str返回带有空字符结尾的字符串,但是data没有提及。 4.

    75040
    领券