[英]using strings as a pointer to its first character
int main()
{
char name[]="avinash";
const char* nameano="a";
strtok(name,"n");
cout<<"the size of name is"<< sizeof(name);
cout<< name;
}
strtok
接受参数(char*, const char*)
; name
是一个数组,因此是指向其第一个元素的指针。 但是如果我们做出这样的声明
string name="avinash";
并将name
作为第一个参数传递给strtok
,那么程序将无法工作,但是它应该是因为name
(一个字符串)是指向其第一个字符的指针。
另外,如果我们写
const string n = "n";
并将其作为第二个参数传递不起作用; 这是我的第一个问题。
现在输出的sizeof(name)
也是8,但应该是4,因为avinash
已被标记。 为什么会这样?
您在混淆几件事。
strtok接受参数(char *,const char *).... name是一个数组,因此是指向其第一个元素的指针...
name
是一个数组,并且不是指向其第一个元素的指针。 数组在多个上下文中会衰减指向其第一个参数的指针,但从原理上讲,这是完全不同的事情。 您会注意到这一点,例如,当在指针和数组上应用sizeof
运算符时:在数组上获得数组大小(即其元素的累积大小),在指针上获得指针的大小(固定) )。
但是,如果我们像字符串name =“ avinash”那样声明,并将name作为参数传递,则该编将不起作用,但是应该这样做,因为string的名称是指向其第一个字符的指针...
如果你这样声明
string name="avinash";
你说的是完全不同的话; 这里的string
不是C字符串(即char[]
),而是C ++ std::string
类型,它是管理动态字符串的类; 这两件事完全不同。
如果要从std::string
获取常量C字符串( const char *
),则必须使用c_str()
方法。 尽管如此,您仍不能将以这种方式获得的指针与strtok
,因为c_str()
返回指向const
C字符串的指针,即它无法修改。 请注意, strtok
不适用于C ++字符串,因为它是旧版C库的一部分。
同样如果我们写常量字符串n =“ n”; 并将其作为第二个参数传递不起作用...这是我的第一个问题...
这并不是完全相同的动机,但是在这种情况下,您可以简单地使用c_str()
方法,因为strtok
的第二个参数是const
char *
。
现在sizeof(name)输出也为8,但由于avinash已被标记化,因此它应该为4。
sizeof
返回其操作数的“静态”大小(即为其分配了多少内存),它对name
的内容一无所知。 要获得C字符串的长度,您必须使用strlen
函数。 对于C ++ std::string
只需使用其size()
方法即可。
我认为您必须像这样将您的name []数组传递给strtok:
strtok(&name[0],"n");
首先, strtok
是C而不是C ++,并且不能与C ++字符串一起使用。 另外,如果不使用该函数的返回结果,它将无法正常工作。
char name[]="avinash";
char * tok_name = strtok(name,"n");
std::cout<<"the size of name is"<< sizeof(tok_name);
std::cout<< tok_name;
您应该考虑使用std::string::find
, std::string::substr
和STL库中的其他内容而不是C函数。
我不相信调用strtok时名称数组的实际大小会发生变化。 如果将空指针传递给该调用,该调用将记住该调用的最后一个位置,并且它将继续标记该字符串。 strtok调用的返回值是在提供的字符串中找到的令牌。 您的代码正在调用sizeof(name),而strtok函数实际上并未对其进行调整。
int main()
{
char name[] = "avinash";
const char* nameano = "a";
char* token;
token = strtok(name, "n");
cout << "the length of the TOKEN is" << strlen(token) << endl;
cout << token << endl;
cout << "the length of the string is" << strlen(name) << endl;
cout << name << endl;
}
试试这个吧? 我不在编译器的前面,所以它可能是我犯了一个错误,但是它应该可以使您正确地解决该问题。
这也可能有帮助: http : //msdn.microsoft.com/zh-cn/library/2c8d19sb(v=vs.71).aspx
如您所说, strtok
接受char *
和const char *
类型的参数。 string
不是char *
因此将其作为第一个参数传递将无法编译。 对于第二个参数,可以使用c_str()
成员函数将字符串转换为const char *
。
您要解决什么问题? 如果您只是想学习strtok
工作原理,那么坚持使用原始字符数组会更好。 该函数是从C继承的,因此在设计时并未考虑C ++字符串。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.