C++ C++;:是";“我的文本”;std::string、*char还是c-string?
我刚才所做的似乎是: 首先我们读到的是这样的:C++ C++;:是";“我的文本”;std::string、*char还是c-string?,c++,string,char,C++,String,Char,我刚才所做的似乎是: 首先我们读到的是这样的: #include <fstream> int main() { using namespace std; ifstream inf("file.txt"); // (...) } #包括 int main(){ 使用名称空间std; ifstream-inf(“file.txt”); // (...) } 其次,我们尝试在代码中使用类似的内容,如下所示: #include <f
#include <fstream>
int main() {
using namespace std;
ifstream inf("file.txt");
// (...)
}
#包括
int main(){
使用名称空间std;
ifstream-inf(“file.txt”);
// (...)
}
其次,我们尝试在代码中使用类似的内容,如下所示:
#include <fstream>
int main() {
using namespace std;
std::string file = "file.txt"; // Or get the name of the file
// from a function that returns std::string.
ifstream inf(file);
// (...)
}
#包括
int main(){
使用名称空间std;
std::string file=“file.txt”;//或获取文件名
//从返回std::string的函数。
ifstream-inf(文件);
// (...)
}
第三,新手开发人员被一些神秘的编译器错误消息所困扰
问题是将const*char
作为构造函数参数
问题是
现在,真正的问题是,对于新手来说,几乎所有教程中给出的“file.txt”或类似示例看起来都很像std::string
那么,“我的文本”是std::string、c-string还是*char,还是取决于上下文
你能举例说明“我的文本”如何根据上下文进行不同的解释吗
[编辑:我认为上面的例子会让它变得明显,但我应该更明确:我的意思是包含在双引号内的任何字符串的类型,即“myfilename.txt”,而不是“string”一词的含义。]
谢谢
那么,“string”是std::string
、c-string还是char*
,还是取决于上下文
这完全取决于上下文。:-)欢迎使用C++。
C字符串是以null结尾的字符串,它几乎总是与char*
相同
根据您使用的平台和框架,单词“string”可能有更多的含义(例如,它也用于在Qt中指QString
,或在MFC中指CString
)
=
的右侧包含一个(原始)字符串文字(即以null结尾的字节字符串)。它的有效类型是常量字符的数组
这里的=
是一匹狡猾的小马:没有分配任务。std::string
类有一个构造函数,该构造函数将指向char的指针作为参数,调用该构造函数可创建一个临时std::string
,该构造函数用于复制std::string
类型的对象文件
不过,编译器可以自由地省略复制ctor并直接实例化文件
但是,请注意,std:string
与以C样式null结尾的字符串不同。它甚至不需要以null结尾
ifstream inf("file.txt");
std::ifstream
类有一个接受const char*
的ctor,传递给它的字符串文字衰减为指向字符串第一个元素的指针
需要记住的是:
std::string
提供了C风格字符串的(几乎无缝)转换。您必须查找函数的签名,以查看是否在<代码> const char */COD>或<代码> STD::String >(后者是隐式转换)。C++标准库提供了一个STD:String类来管理和表示字符序列。它封装了内存管理,大多数情况下是作为C字符串实现的;但这是一个实现细节。它还为常见任务提供操作例程
std::string类型始终是这样的(例如,它没有到char*的转换运算符,这就是为什么有c_str()方法),但它可以由c-string(char*)初始化或分配
另一方面,如果有一个函数采用std::string或const std::string&作为参数,则可以向该函数传递一个c-string(char*),编译器将为您构建一个std::string。根据您所说的上下文,这将是一种不同的解释。它应该尽可能多地表示
std::string
(如果您使用的是提供这种功能的框架,也可以使用类似的替代方法,如wxString
,QString
等。有时您除了使用以NUL结尾的字节序列外别无选择,但通常希望尽可能避免使用它
归根结底,根本没有明确、明确的术语。这就是生活
那么,“string”是std::string、c-string还是*char,还是取决于上下文
-
<> L> C和C++都没有内置的字符串数据类型,所以代码中的任何双引号字符串基本上是代码> conchchar */COD>(或<代码> const char []/COD>精确)。“C字符串”通常指的是这个,特别是一个带有null终止符的字符数组。
- C++中,<>代码> STD::String 是一个将一个原始字符串封装到一个对象中的便利类。通过使用它,您可以避免自己做(杂乱)指针算术和内存重新分配。
- 大多数标准库函数仍然只接受
(或char*
)参数const char*
- 您可以将
隐式转换为char*
,因为后者有一个构造函数来完成此操作std::string
- 必须使用
方法将c_str()
显式转换为std::string
const char*
感谢Clark Gaebel指出
ifstream inf("file.txt");
const char* v()
{
char* text = “Hello”;
return text;
// Above code can be reduced to:
// return “Hello”;
}
const char* v()
{
char text[] = “Hello”;
return text;
}