首页
学习
活动
专区
工具
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对实例赋值时,后面打印的结果是追加字符串的值.

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

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

    26810

    【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.4K10

    c++标准模板库

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

    52410

    【Linux】从零开始手搓 Shell (超详解)

    () // 打印命令行提示符 { printf("%s", MakeCommandLine().c_str()); // 没有 \n fflush(stdout); //让 printf...打印字符串立马刷新出来 } 使用 printf 或 cout 打印内容时,输出永远不会直接写入“屏幕”。...打印命令行提示符 { printf("%s", MakeCommandLine().c_str()); // 没有 \n fflush(stdout); //让 printf 打印字符串立马刷新出来...,当输入的数据大小超过了第二个参数指定的大小的时候,fgets()仅仅读取前面的“第二个参数减1”个字符,而预留1个字符的空间来存储字符串结束符’\0’。...命令行提示符 { printf("%s", MakeCommandLine().c_str()); // 没有 \n fflush(stdout); //让 printf 打印字符串立马刷新出来

    16110

    【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.

    42920

    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啊,怎么回事?

    12210

    题目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')才结束转化,并将结果返回。

    781100

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

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

    2.8K52

    用好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) # 打印

    37830

    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一样,默认以换行或者是空格作为标识,如果我们想打印出有空格的字符串,是行不通的!!

    16310

    【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的一部分,再将其构建成新对象返回

    54420

    C++ string库 resize坑

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

    1.3K30
    领券