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
已被标记化。为什么会这样?
答案 0 :(得分:4)
你混淆了几件事。
strtok接受参数(char *,const char *).... name是一个数组,因此是指向其第一个元素的指针......
name
是一个数组, 它不是 指向其第一个元素的指针。数组在几个上下文中指向其第一个参数的指针中衰减,但原则上它是完全不同的东西。你注意到这个例子当您在指针和数组上应用sizeof
运算符时:在数组上获取数组大小(即其元素的累积大小),在指针上获得指针的大小(已修复) )。
但是如果我们做了一个像string name =“avinash”这样的声明并且传递了name作为参数 然后编程不起作用,但它应该因为字符串的名称是指向其第一个字符的指针...
如果您做出类似
的声明string name="avinash";
你说的是一个完全不同的东西; string
这里不是C字符串(即char[]
),而是C ++ std::string
类型,它是一个管理动态字符串的类;这两件事完全不同。
如果要从const char *
获取常量C字符串(std::string
),则必须使用c_str()
方法。尽管如此,您仍然无法使用strtok
以这种方式获得的指针,因为c_str()
会返回指向 const
C字符串的指针,即它不能被修改。请注意,strtok
不适用于C ++字符串,因为它是旧C库的一部分。
如果我们写const string n =“n”;并将其作为第二个参数传递它不起作用......这是我的第一个问题......
这对于完全相同的动机不起作用,但在这种情况下,您可以简单地使用c_str()
方法,因为strtok
的第二个参数是 {{ 1}} const
。
现在sizeof(name)输出也是8,但是当avinash被标记化时它应该是4 ..
char *
返回其操作数的“静态”大小(即为其分配了多少内存),它对sizeof
的内容一无所知。要获得C字符串的长度,您必须使用name
函数;对于C ++ strlen
,只需使用其std::string
方法。
答案 1 :(得分:0)
我认为你必须将你的名字[]数组传递给strtok:
strtok(&name[0],"n");
答案 2 :(得分:0)
首先,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函数。
答案 3 :(得分:0)
我不相信当你调用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/en-us/library/2c8d19sb(v=vs.71).aspx
答案 4 :(得分:0)
正如您所说,strtok
接受char *
和const char *
类型的参数。 string
不是char *
所以传递它作为第一个参数将不会编译。对于第二个参数,您可以使用const char *
成员函数将字符串转换为c_str()
。
你想解决什么问题?如果您只是想了解strtok
的工作原理,那么坚持使用原始字符数组会好得多。该函数继承自C,因此不考虑C ++字符串。