C++中关于string类型究竟能不能用cout输出的问题(转载https://www.cnblogs.com/mzct123/p/4876185.html)

本文详细解析了C++中使用cout输出string类型的常见问题及解决方案,区分了CString、string与string.h的不同,并提供了代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先让我讲下故事哈

一次在MFC中用cout输出一个string类型字符串,编译时出现这样一个错误:

error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >' (or there is 

no acceptable conversion)

以后我记住了C++中不能用cout输出string,所以我尽量避免,若用到string类型输出,则先将string转为char*,但今晚敲代码时突然碰到string可以用cout输出,所以再次做下概述,不过一下内容大都是网上的,仅供参考。

答案:首先得说这个问题的答案是肯定的,cout重载了string类型,所以在c++ 中可以直接输出。

先来看CString、string和string.h这几个区别:

CSting:CString是MFC或者ATL中的实现,是MFC里面封装的一个关于字符串处理的功能很强大的类,只有支持MFC的工程才可以使用。如在linux上的工程就不能用CString了,只能用标准C++中的string类了。在MFC中使用不需要自己加,但在另外的程序中需要加入#include<CString>。

string:string类既是一个标准c++的类库,同时也是STL(Standard Template Library,标准模版库)中的类库,已经纳入C++标准之中。它和CString有本质的区别。

string.h:C语言里面关于字符数组的函数定义的头文件,常用函数有strlen、strcmp、strcpy等等,这个头文件跟C++的string类半点关系也没有,所以 <string>并非 <string.h>的“升级版本”,他们是毫无关系的两个头文件。

综上,cout函数重载的是string类库中的string类型,而不是CString或string.h中的。

例:

复制代码
 1 #include<iostream>
 2 #include<CString>
 3 //#include<string.h>
 4 
 5 using std::cout;
 6 using std::string ;
 7 using std::endl;
 8 
 9 main()
10 {
11     string a;
13     a="*******";
15     cout<<a<<endl;
16 }
复制代码

当编译这个程序时,会出现这样的如上的error,而如果把上面的头文件改为#include<string>时,error就会消失。

而在MFC中或你包含的是CString头文件,如果想用cout输出string 类型,则需要先把string类型转换char*型,如上面例子:

复制代码
 1 #include<iostream>
 2 #include<CString>
 3 
 4 using std::cout;
 5 using std::string ;
 6 using std::endl;
 7 
 8 main()
 9 {
10     string a;
11     a="*******";
12     char* b=(char*)a.c_str(); //将string类型转为char*
13     cout<<b<<endl;
14 }
复制代码

 

  • *关于将string转为char*,详情请见http://blog.sina.com.cn/s/blog_786ce14d01014lpr.html

 

### 关于 cnblogs qianfu 博客内容 根据已知的信息,`cnblogs qianfu` 并未直接提及具体的博客内容或作者信息。然而,可以从引用中推测一些可能的方向。例如,在引用[2]中提到的 `Sdcb Chats` 项目是由 `sdcb` 创建并维护的一个开源项目[^2]。虽然这并非来自 `qianfu` 的博客,但它展示了 Cnblogs 上的技术博主通常会分享的内容类型Cnblogs 是一个知名的中文技术博客平台,许多开发者会在上面撰写关于编程、算法、框架集成等方面的文章。如果想了解 `qianfu` 的具体博客内容,可以通过以下方式获取更多信息: 1. **访问链接**: 直接打开 [https://www.cnblogs.com/qianfu](https://www.cnblogs.com/qianfu),查看该用户的最新文章列表。 2. **分析主题**: 如果无法直接访问或者需要进一步确认其内容方向,可以根据常见的技术领域猜测,比如 Spring Boot 集成 ElasticSearch[^3] 或者 ACM 算法竞赛中的实现细节[^4]。 以下是基于假设和技术趋势整理的相关知识点示例: #### 示例代码片段 假如 `qianfu` 曾经发布过有关字符串映射处理的教程,则可能会涉及类似的逻辑结构: ```cpp #include <iostream> using namespace std; // 字符串替换函数演示 void replaceString(string& str, const string& from, const string& to) { size_t start_pos = str.find(from); if(start_pos != string::npos) str.replace(start_pos, from.length(), to); } int main(){ string s = "hello world"; replaceString(s,"world","everyone"); cout << s; } ``` 此代码展示了一个简单的字符串替换功能,适用于多种场景下的文本操作需求。 ### 注意事项 由于实际请求的目标站点具体内容未知,以上仅作为理论上的可能性探讨。对于确切的主题范围,请参照目标页面的实际文档说明为准。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值