我有以下示例,取自此处:
// 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;
}
现在作为第二个参数,我们有一个字符串(而不是像第一个例子中那样指向数组的指针)。
请有人澄清这种不一致吗?
答案 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`,它是一个字符串文字,主要存储在只读标记的内存中。