C++ 为什么不是';斯特伦为我工作吗? charp[4]={'h','g','y'}; cout
从给定的指针开始,直到到达字符C++ 为什么不是';斯特伦为我工作吗? charp[4]={'h','g','y'}; cout,c++,string,C++,String,从给定的指针开始,直到到达字符“\0”。如果数组中没有'\0',则它可以是任何数字,直到到达'\0' 另一种方法是使用:int length=sizeof(p)/sizeof(*p),它将为您提供数组的长度。但是,严格来说,这不是由strlen定义的字符串长度 正如@John Dibling提到的,strlen在您的第一个示例中给出正确结果的原因是您为4个字符分配了空间,但只使用了3个;剩余的1个字符自动初始化为0,这正是strlen查找的'\0'字符。'\0'终止字符缓冲区 char p[]=
“\0”
。如果数组中没有'\0'
,则它可以是任何数字,直到到达'\0'
另一种方法是使用:int length=sizeof(p)/sizeof(*p)代码>,它将为您提供数组的长度。但是,严格来说,这不是由strlen
定义的字符串长度
正如@John Dibling提到的,strlen
在您的第一个示例中给出正确结果的原因是您为4个字符分配了空间,但只使用了3个;剩余的1个字符自动初始化为0,这正是strlen查找的'\0'
字符。'\0'
终止字符缓冲区
char p[]={'h','g','y'};
cout<<strlen(p);
这将得到一个随机数strlen
要求字符串以'\0
'结尾才能工作。请尝试以下操作:
char p[4]={'h','g','y', '\0'};
只有第一个示例具有以null结尾的字符数组-其他两个示例没有以null结尾的字符,因此您不能以定义良好的方式对它们使用strlen()
char p[4]={'h','g','y', '\0'};
请注意,在最后一种情况下,如果使用字符串文字来初始化数组,将得到一个空终止符:
char p[4]={'h','g','y'}; // p[3] is implicitly initialized to '\0'
char p[3]={'h','g','y'}; // no room in p[] for a '\0' terminator
char p[]={'h','g','y'}; // p[] implicitly sized to 3 - also no room for '\0'
这是因为strlen()希望为字符串找到空终止符。在本例中,您没有它,因此strlen()会一直计数,直到它发现\0或出现内存访问冲突并导致程序死亡。扯开 strlen
是一个标准的库函数,可以处理字符串(在术语的C意义上)。字符串定义为以\0
值结尾的char
值数组。如果您向strlen提供的不是字符串的内容,则行为未定义:代码可能崩溃,代码可能产生无意义的结果等
在您的示例中,只有第一个提供了字符串strlen
,这就是它按预期工作的原因。在第二种和第三种情况下,您提供的不是字符串(不是以\0
结尾),这就是预期结果没有意义的原因。另外,使用char p[]=“hgy”代码>@Paul:因为大约有17个人同时格式化了它。同步编辑警告只在编辑时间超过一分钟左右时生效。这有一个<代码> C++ >代码>标签,为什么你在C++中使用C字符串?正如您刚刚发现的,它们对于初学者来说有点难用。使用std::string
。它不会完全隐藏这种疯狂,但它会将其降低到一个新手可以处理的水平。@Johannes,你是说没有足够的初始值设定项吗?因为在所有情况下,我都看到提供的初始值设定项有足够的空间。祝贺你用C字符串编写了缓冲区溢出!你加入了一个深受全世界黑客喜爱的精英编码团队。+1这是一个很好的回应。我要补充的唯一一件事是解释为什么第一个代码段可以工作。在charp[4]={'h','g','y'}
p是4个字符,但只有3个被显式初始化,因此编译器将所有剩余(未指定)元素初始化为0
。我完全同意上面的评论。在这个特定示例中,最后的\0
是不必要的。所有未指定的元素将被初始化为零。严格来说,数字将是未定义的,而不是随机的。(即,不要使用strlen()作为彩票结果的基础;^))
char p[4]={'h','g','y', '\0'};
char p[4]={'h','g','y'}; // p[3] is implicitly initialized to '\0'
char p[3]={'h','g','y'}; // no room in p[] for a '\0' terminator
char p[]={'h','g','y'}; // p[] implicitly sized to 3 - also no room for '\0'
char p[]= "hgy"; // p[] has 4 elements, last one is '\0'