【发布时间】:2013-04-03 08:05:29
【问题描述】:
我有以下示例,取自这里:
// 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;
}
现在作为第二个参数,我们有一个字符串(而不是第一个示例中的指向数组的指针)。
请任何人澄清这种不一致之处吗?
【问题讨论】:
-
澄清一下:
"..."被称为字符串文字,它不是std::string。您可能会感到困惑,因为std::string有一个允许从字符指针进行隐式转换的构造函数,即std::string(char const* str) -
仅作记录:
strtok不应在您必须维护的代码中使用。 (它是像gets这样的函数之一,由于历史原因而存在,但不应在新代码中使用。) -
@Pubby,但是为什么我们在第二个例子中使用“字符串文字”作为
std::strcpy的第二个参数,我们不需要使用指针作为第二个参数(其值将传递给std::strcpy)的第一个参数? -
@Roman 因为字符串文字可以隐式转换为
char const*。您希望它看起来如何? -
@Pubby,感谢您的澄清。我不知道
"..."被解释为char const*,我认为它只是string类型的值,我们需要将它分配给一个变量(例如x)并且使用&x作为std::strcpy的第二个参数来传递地址。但正如我从你那里了解到的,"..."已经是一个地址(老实说,这是一个违反直觉的想法)。例如,您会期望 2 只是一个整数值,而不是指针(它只是一个值,而不是指针)。但是,相比之下,“abs”不是一个值,它已经是一个指向数组的指针。