我们应该使用什么作为std :: strcpy的第二个参数?

时间:2013-04-11 07:58:24

标签: c++ pointers std strcpy

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

// 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)给出的指针。

但是,我有以下示例,取自here

#include <iostream>
#include <cstring>

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

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

请有人澄清这种不一致吗?

4 个答案:

答案 0 :(得分:4)

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

“我是字符串!”

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

n3376 2.14.5 / 8

普通字符串文字和UTF-8字符串文字也称为窄字符串文字。一个箭头 string literal的类型为“const of n const char”,其中n是下面定义的字符串的大小,并且 静态存储持续时间(3.7)。

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

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

答案 1 :(得分:4)

  

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

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

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

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

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

答案 2 :(得分:1)

  

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

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

答案 3 :(得分:0)

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