首页
学习
活动
专区
工具
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;

这将只输出一次字符串。

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

相关·内容

为什么?》

所以要打印本地变量,只有由shell来做。 打印命令行提示符(PrintCommandLine): 启动shell程序,就是创建-bash进程,本质就是一个进程。...通过string进行传递,如果要谁用c语言的字符串,就通过c_str()进行获得底层char。...; } // //1.打印命令行提示符 void PrintCommandLine() { printf("%s",MakeCommandLine().c_str())...读取时,处理换行符: 如果我们以一行来读取字符串,那么最会就有换行符,换行符也会读取进来。所以打印的时候,我们没有加换行,也是来到了新的一行。 解决办法: 在返回前,把\n置为0。...指向很多的字符串。后序我们碰见要导入环境变量的命令,我们直接在shell中的genv数组指向一个堆空间,然后把第一个为空的数组指向这个字符串。 为什么要新申请空间,然后拷贝,再指向?

10810

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对实例赋值时,后面打印的结果是追加字符串的值.

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

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

    31010

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

    【Linux】简易版shell

    PrintCommandLine 接下来就需要实现打印命令行的函数了,首先看一下我们打印命令行时需要什么?...pwd一直都处在当前路径下,也就是我们的自己的shell运行的那个目录下,所以这里,这里前两个函数都很容易理解,只需要解释一下最后一个,我们来看看snprintf这个函数 这个函数是将后面的一个字符串以某种格式打印到前面的...如果获取成功,当前工作路径将存储在Pwd当中,snprintf,这个函数我们将Pwd这个字符串以PWD="Pwd"这样的格式打印这个,所以这里Pwdenv已经存储了环境变量的那个格式,获取了环境变量瞬时应该将环境变量表中的环境变量更新一下...(),GetHostName().c_str(),GetPwd().c_str()); return Command_Line; } PrintCommandLine 这里打印的时候需要刷新的一下屏幕...注意:最后一个位置的字符需要改为0,因为我们输入的时候,会回车也是一个字符,所以应该将这个回车给去掉 当获取的命令中只有回车的时候,将回车去掉strlen就变为0了,所以只有回车时不需要解析命令,所以直接返回

    3600

    c++标准模板库

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

    53210

    【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 打印的字符串立马刷新出来

    21910

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

    43320

    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.5K30

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

    13710

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

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

    2.9K52

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

    786100

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

    39030

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

    18510
    领券