繁体   English   中英

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

[英]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::findstd::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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM