1.length()成員函數(shù)
length()函數(shù)是string的內(nèi)置成員方,用于返回string類型字符串的實(shí)際長(zhǎng)度。
length()函數(shù)聲明:
// 返回 string 長(zhǎng)度,單位字節(jié)
size_t length() const noexcept;
示例1:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s= "hello world!";
cout << s.length() << endl;
return 0;
}
2.size()成員函數(shù)
size()函數(shù)與length()一樣,沒(méi)有本質(zhì)區(qū)別。string類剛開(kāi)始只有l(wèi)ength()函數(shù),延續(xù)了C語(yǔ)言的風(fēng)格。引入STL之后,為了兼容又加入了size,這樣就可以方便的使用于STL的算法。
size()函數(shù)聲明:
// 返回 string 長(zhǎng)度,單位字節(jié)。作用等同于 length()
size_t size() const noexcept;
示例2:
#include<iostream>
#include<string>
using namespace std;
int main()
{
string s= "hello world!";
cout << s.size() << endl;
return 0;
}
3.借助strlen()函數(shù)
strlen函數(shù):計(jì)算字符串str的長(zhǎng)度,從字符的首地址開(kāi)始遍歷,以 ‘\0’ 為結(jié)束標(biāo)志,然后將計(jì)算的長(zhǎng)度返回,計(jì)算的長(zhǎng)度并不包含’\0’。
因?yàn)?strlen() 函數(shù)是用于 C 風(fēng)格字符串的,因此要使用 c_str() 成員函數(shù)來(lái)獲取 string 對(duì)象的 C 風(fēng)格字符串表示,然后將它傳遞給 strlen() 函數(shù)。
strlen()函數(shù)聲明:
// C 標(biāo)準(zhǔn)庫(kù)函數(shù),返回C風(fēng)格字符串長(zhǎng)度,單位字節(jié) size_t
strlen ( const char * str );
const char * str常量指針,指針的指向可以更改,但是指針指向的值不能更改。
示例3:
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
string s= "hello world!";
cout << strlen(s.c_str()) << endl;
return 0;
}
4.注意事項(xiàng)
(1)length()方法和size()方法是不受結(jié)束標(biāo)志‘\0’ ,返回的是字符串的實(shí)際長(zhǎng)度,而strlen() 函數(shù)遇到結(jié)束標(biāo)志‘\0’就停止,返回的是遇到的第一個(gè)結(jié)束標(biāo)志前的字符串長(zhǎng)度。下面看一個(gè)例子:
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
char buf[10] = { 0 };
buf[0] = 'a';
buf[2] = 'v';
buf[3] = 'h';
buf[4] = '\0';
string s(buf, 6);
cout << "s:" << s << endl;
cout << "length方法:" << s.length() << endl;
cout << "size方法:" << s.size() << endl;
cout << "strlen方法:"<< strlen(s.c_str()) << endl;
return 0;
}
注意:char buf[10] = { 0 }是只給buf數(shù)組的第一個(gè)元素賦結(jié)束標(biāo)志’\0‘,剩余的9個(gè)元素沒(méi)進(jìn)行賦值操作,也都為結(jié)束標(biāo)志’\0’。
從結(jié)果中可以看到,length()和size()方法返回的是字符串的實(shí)際長(zhǎng)度,而strlen方法則是受到’\0‘的影響進(jìn)行截?cái)嗔恕?/p>
(2)此外這里還有一個(gè)坑需要注意:
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
string s= "hello\0 world!";
cout << "length方法:" << s.length() << endl;
cout << "size方法:" << s.size() << endl;
cout << "strlen方法:"<< strlen(s.c_str()) << endl;
return 0;
}
按照上面的理論,這里應(yīng)該輸出:
length方法:13
size方法:13
strlen方法:5
才對(duì),但是實(shí)際運(yùn)行結(jié)果為:
這是為何呢?
實(shí)際上,string是C++的一個(gè)類,在string s= “hello\0 world!”;這行代碼中,它的構(gòu)造函數(shù)是借助了strlen函數(shù)實(shí)現(xiàn)的
for(int i = 0; i < strlen(s);i++)
{
/
}
因此,實(shí)際上s字符串只取到了’\n‘前面的字符串,后面的都被截?cái)嗔?,我們可以輸出看一下?mark hidden color="red">文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-731462.html
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
string s= "hello\0 world!";
cout << s << endl;
return 0;
}
因此,采用string直接定義的字符串利用length()方法和size()方法時(shí),實(shí)際的長(zhǎng)度和strlen()方法一樣,但是其中的原理是不同的。在弄清原理后,就很好區(qū)分這三種方法了。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-731462.html
到了這里,關(guān)于C++中求string類型字符串長(zhǎng)度的三種方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!