C++:"我的文本"是std :: string,*char还是c-string?

aug*_*tin 9 c++ string char

我刚刚做了一个看似常见的新手错误:

首先,我们阅读了许多教程之一,如下所示:

 #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,还是取决于上下文?

  • C和C++都没有内置的字符串数据类型,因此代码中的任何双引号字符串基本上const char *(或者说const char []是确切的)."C string"通常是指这个,特别是带有null终止符的字符数组.
  • 在C++中,std::string是一个将原始字符串包装到对象中的便捷类.通过使用它,您可以避免必须自己执行(杂乱)指针算法和内存重新分配.
  • 大多数标准库函数仍然只使用char *(或const char *)参数.
  • 您可以隐式转换char *std::string因为后者有一个构造函数来做到这一点.
  • 您必须使用该方法将a显式转换std::string为a .const char *c_str()

感谢Clark Gaebel指出constness,jalf和GMan提到它实际上是一个阵列.

  • 双引号字符串不是`char*`,它们是`const char*`.此外,你不能将`std :: string`转换为带有`c_str()`的`char*`,它再次返回一个`const char*`.确定const-correctness很难,但这并不意味着你可以完全忽略它. (2认同)
  • 实际上,字符串文字是一个const char*数组*,而不是一个指针.:) (2认同)

Den*_*ose 7

"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*,但不推荐使用此行为.如果您尝试以这种方式修改基础字符串,则最终会出现未定义的行为.这不是一个好主意.