我刚刚做了一个看似常见的新手错误:
首先,我们阅读了许多教程之一,如下所示:
#include <fstream>
int main() {
using namespace std;
ifstream inf("file.txt");
// (...)
}
Run Code Online (Sandbox Code Playgroud)
其次,我们尝试在代码中使用类似的东西,如下所示:
#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);
// (...)
}
Run Code Online (Sandbox Code Playgroud)
第三,新手开发人员对一些神秘的编译器错误消息感到困惑.
问题是,ifstream的需要const * char
作为构造函数的参数.
该解决方案是的std :: string为const*字符转换.
现在,真正的问题是,对于一个新手来说,几乎所有教程中给出的"file.txt"或类似的例子看起来都像std :: string.
那么,"我的文本"是std :: string,c-string还是*char,还是取决于上下文?
您能否举例说明"我的文本"将如何根据上下文进行不同的解释?
[编辑:我认为上面的例子会让它显而易见,但我应该更明确一点:我的意思是双引号中包含的任何字符串的类型,即"myfilename.txt",而不是单词的含义'串'.]
谢谢.
cas*_*nca 10
那么,"string"是std :: string,c-string还是*char,还是取决于上下文?
const char *
(或者说const char []
是确切的)."C string"通常是指这个,特别是带有null终止符的字符数组.std::string
是一个将原始字符串包装到对象中的便捷类.通过使用它,您可以避免必须自己执行(杂乱)指针算法和内存重新分配.char *
(或const char *
)参数.char *
成std::string
因为后者有一个构造函数来做到这一点.std::string
为a .const char *
c_str()
感谢Clark Gaebel指出const
ness,jalf和GMan提到它实际上是一个阵列.
"myString"
是一个字符串文字,并具有类型const char[9]
,9常量数组char
.请注意,它有足够的空间用于null终止符.所以"Hi"
是const char[3]
,等等.
这几乎总是正确的,没有歧义.然而,在必要时,一个const char[9]
将衰变成一个const char*
指向它的第一个元素.并且std::string
有一个接受a的隐式构造函数const char*
.因此,虽然它始终以char数组开头,但如果需要它,它可以成为其他类型.
请注意,字符串文字具有也const char[N]
可以衰减的唯一属性char*
,但不推荐使用此行为.如果您尝试以这种方式修改基础字符串,则最终会出现未定义的行为.这不是一个好主意.
归档时间: |
|
查看次数: |
3640 次 |
最近记录: |