string 长度的问题

AlywinXee 2012-11-21 08:56:57
请教各位一个问题:

#include<iostream>
#include<string>
using namespace std;

int main()
{
string str = "String";
cout<<"The size of String is "<<str.size()<<endl;
cout<<"The length of String is "<<str.length()<<endl;
return 0;
}

运行结果是:

在以前的C++课上,老师说过,“为了兼容C语言,C++中所有字符串字面值都有编译器自动在末尾添加一个空字符”P36
如"A",其实是包含字母A和空字符两个字符的字符串,按照这样,算出来size不是应该是7么,难道str不是字符串字面值?请各位指教!我是数学系跨过来的,菜青菜青的,希望在坛子里,与各位一起进步!
...全文
369 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
ForestDB 2012-11-23
  • 打赏
  • 举报
回复
size Return length of string (public member function) length Return length of string (public member function) 不要把不相关的东西混在一起想。
lin6224 2012-11-23
  • 打赏
  • 举报
回复
2楼的说的很详细了,补充一点。最后是以\s结尾的。
gauldoth 2012-11-22
  • 打赏
  • 举报
回复
string str = "String";
这里面str是变量,variable.
"String"是字符串字面值,string literal.
比如
int a = 3;
这里3也是字面值.
http://www.cplusplus.com/doc/tutorial/constants/
gauldoth 2012-11-22
  • 打赏
  • 举报
回复
"String" 这个叫做字符串字面值. A string literal is the representation of a string value within the source code of a computer program.
Qyee16 2012-11-22
  • 打赏
  • 举报
回复
以'\0'结尾,是char字符串的结尾形式, 但对于string类来说,已经不是内置类型,内置类型,包括基本的int double float char等 至于string 的size length成员函数返回内容完全是它自己的事情了,你也可以定义一个自己的MyString类,来完成通常类库的string的内容。。 类库中的string内部维护了一个 char*的指针,所以你说的以'\0'一点错误都没有 返回的6 是告诉你str中占用字节数,,,当然size length是string类的成员函数,每个成员函数都有他的意义,至少是什么看它的实现,在这里size是返回包不包括'\0',都可以的。。。因为它仅仅是个实现了string类的成员函数,不是标准的一部分。。每个类库都可以有它自己的实现。。。 string类 的 size length都是返回其长度的,两个函数有同样的功能。。。。其中很是有趣。。。
firendlys 2012-11-22
  • 打赏
  • 举报
回复
引用 10 楼 wyc6668205 的回复:
char *str = "abc"; sizeof(str) 得4的原因是str是指针,指针类型占4字节,不是字符串占缓冲区的长度.
你说得对,当时没留意,举例举错了... 其实我当初想说的是: char str[]="abc"; 一时手误,多谢指正..
盛夏 2012-11-22
  • 打赏
  • 举报
回复
引用 1 楼 firendlys 的回复:
strlen 是指从第一个字符开始,到最后一个非0字符之间的字符数.. string::size() 和 string::length() 都是指字符串的长度(也就是类似 strlen 的效果),不是指缓冲区的长度... 不要把这2个概念混淆了. 就像一个很简单的问题: char str[10]="abc"; 那么,str这个缓冲区总共有10个字……
char *str = "abc"; sizeof(str) 得4的原因是str是指针,指针类型占4字节,不是字符串占缓冲区的长度.
rocktyt 2012-11-22
  • 打赏
  • 举报
回复
引用 5 楼 Qyee16 的回复:
因为它仅仅是个实现了string类的成员函数,不是标准的一部分。。每个类库都可以有它自己的实现。。。
这说的不对了,string是标准库的一部分,size和length的返回值是标准规定的
hongwenjun 2012-11-22
  • 打赏
  • 举报
回复
#include <iostream>
#include <string.h>

using namespace std;

int main()
{
    string str("ABCDEFGHIJKLMNOP");
    cout << str.size() << str << endl;
    str[5] = '\0';
    cout << str.size() << str << endl;
    cout <<  strlen(str.c_str()) << str.c_str() << endl;
    return 0;
}
LXJSLK 2012-11-21
  • 打赏
  • 举报
回复
用size和length算,都不加最后的空字符,但空字符还是占了一个字节。
自信男孩 2012-11-21
  • 打赏
  • 举报
回复
最后一个空间应该是字符串的结束符,就是'\0'。在内存中该结束符是占用一个字节的空间的。
AlywinXee 2012-11-21
  • 打赏
  • 举报
回复
引用 楼主 AlywinXee 的回复:
请教各位一个问题: C/C++ code?123456789101112#include<iostream>#include<string>using namespace std; int main(){ string str = "String"; cout<<"The size of String is "<<str.size()<<endl; c……
您的意思是说,这个str在内存中,系统为他开辟了7个字节的空间,但实际上最后一个空间是空的?
firendlys 2012-11-21
  • 打赏
  • 举报
回复
strlen 是指从第一个字符开始,到最后一个非0字符之间的字符数.. string::size() 和 string::length() 都是指字符串的长度(也就是类似 strlen 的效果),不是指缓冲区的长度... 不要把这2个概念混淆了. 就像一个很简单的问题: char str[10]="abc"; 那么,str这个缓冲区总共有10个字节的空间, sizeof(str) = 10 !! 但是,str这个字符串长度只有3 , 即: strlen(str) = 3 !! char *str="abc"; 此时: str 总共占用4个字节的空间(最后有一个0),但是,strlen(str) 依然是3 !!

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧