0

我有以下示例,取自此处:

// strings and c-strings
#include <iostream>
#include <cstring>
#include <string>

int main ()
{
  std::string str ("Please split this sentence into tokens");

  char * cstr = new char [str.length()+1];
  std::strcpy (cstr, str.c_str());

  // cstr now contains a c-string copy of str

  char * p = std::strtok (cstr," ");
  while (p!=0)
  {
    std::cout << p << '\n';
    p = strtok(NULL," ");
  }

  delete[] cstr;
  return 0;
}

据我了解str是一个字符串,str.c_str()是一个指针,指向一个数组的第一个元素,其中包含的字符str作为其元素。然后使用std::strcpy我们将给定地址的值作为它的第二个参数,并将这个值分配给作为第一个参数 ( cstr) 给出的指针。

但是,我有以下示例,取自此处

#include <iostream>
#include <cstring>

int main()
{
    char *str = new char[100];
    std::strcpy(str, "I am string!");
    std::cout << str;
    delete[] str;
}

现在作为第二个参数,我们有一个字符串(而不是第一个示例中的指向数组的指针)。

有人可以澄清这种不一致吗?

4

4 回答 4

4
std::strcpy(str, "I am string!");

“我是弦!”

是字符串文字。真的是(在传递函数时const char[13]衰减到)。const char*

n3376 2.14.5/8

普通字符串文字和 UTF-8 字符串文字也称为窄字符串文字。窄字符串文字的类型为“n const char 数组”,其中 n 是字符串的大小,定义如下,并且具有静态存储持续时间 (3.7)。

n3376 4.2/1 隐式数组到指针的转换。

“NT 数组”或“T 的未知边界数组”类型的左值或右值可以转换为“指向 T 的指针”类型的纯右值。结果是指向数组第一个元素的指针。

于 2013-04-11T08:00:13.267 回答
4

使用 std::strcpy 时,我们将给定地址的值作为其第二个参数,并将该值分配给作为第一个参数 (cstr) 给出的指针。

char * strcpy ( char * destination, const char * source );

没有 strcpy 实际上读取源指向的每个字符并将它们写入目标,当它读取终止的空字符时它会停止。

在您的第二个示例中,您的源参数是一个字符串文字,其类型为 const char[]。此字符串可以衰减为 const char* 以传递给 strcpy。

字符串文字只不过是指向只读位置的指针。

于 2013-04-11T08:01:34.930 回答
1

现在作为第二个参数,我们有一个字符串(而不是第一个示例中的指向数组的指针)

在第二个示例中,您有一个 C 字符串,它是一个指向以 NUL 结尾的字符数组的指针。没有不一致。

于 2013-04-11T08:00:09.833 回答
0

char *strcpy( char *dest, const char *src );需要 const char 的源指针,并将内存复制到 char 类型的目标指针。该函数从源复制字符串长度,直到找到以空字符结尾的源字符串。"I am string!"是一个 const char* const`,它是一个字符串文字,主要存储在只读标记的内存中。

于 2013-04-11T08:03:03.317 回答