使用字符串作为指向其第一个字符的指针

时间:2011-04-08 12:34:29

标签: c++ c string

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已被标记化。为什么会这样?

5 个答案:

答案 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::findstd::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 ++字符串。