我正在做一個使用指標計算字串長度的練習。這是我在下面撰寫的代碼:
int main() {
std::string text = "Hello World";
std::string *string_ptr = &text;
int size = 0;
//Error below: ISO C forbids comparison between pointer and integer [-fpermissive]
while (string_ptr != '\0') {
size ;
string_ptr ;
}
std::cout << size;
}
在我見過的很多例子中,字串通常是一個 char 陣列,我也理解它是一個字串。但是,我想嘗試將其計算為字串物件,但出現以下錯誤。
是否可以在字串是物件的情況下計算它,還是需要是 char 陣列?
uj5u.com熱心網友回復:
如果您只想要字串的大小,那么請使用std::string::size():
auto size = text.size();
或者,您可以使用length(),它做同樣的事情。
但我猜你正試圖重新實作strlen學習目的。在這種情況下,您的代碼存在三個問題。
首先,您嘗試計算字串中的字符數,這意味著您需要指向 的指標char,而不是指向 的指標std::string。該指標還應該指向常量字符,因為您并沒有嘗試修改這些字符。
其次,要獲得指向字串字符的指標,請使用它的方法c_str()。獲取字串的地址只是為您提供指向字串本身的指標,而不是其內容。最重要的是, 指向的字符c_str()是空終止的,因此在這里可以安全地用于您的目的。或者, use ,它的行為與C 11 以來data()的行為相同。c_str()
最后,計算這些字符涉及檢查指標指向的值是否為,'\0'因此您需要在回圈中取消參考它。
把所有這些放在一起:
const char* string_ptr = text.c_str(); // get the characters
int size = 0;
while (*string_ptr != '\0') { // make sure you dereference the pointer
size ;
string_ptr ;
}
當然,這假設字串不包含所謂的“嵌入式空值”,即'\0'結尾之前有字符。std::string可以包含此類字符并且可以正常作業。在這種情況下,您的函式將回傳與字串的方法不同的值size(),但沒有辦法繞過它。
出于這個原因,你真的應該打電話給size().
uj5u.com熱心網友回復:
首先,問題是無關緊要的。std::string::size()是一個 O(1)(恒定時間)操作,因為std::string' 通常存盤它們的大小。即使您需要知道 C 風格字串(aka char*)的長度,您也可以使用strlen. (我知道這是一個練習,但我仍然想警告你。)
無論如何,給你:
size_t cstrSize(const char* cstr)
{
size_t size(0);
while (*cstr != '\0')
{
size;
cstr;
}
return size;
}
您可以std::string通過呼叫std::string::c_str(). 你所做的是獲得一個指向std::string物件本身的指標,并且取消參考它只會給你那個物件。是的,您需要取消參考它(使用*一元運算子)。這就是為什么你得到一個錯誤(這是在(string_ptr != '\0')順便說一句)。
uj5u.com熱心網友回復:
你在這里完全糊涂了。
“text”是一個 std::string,它是一個帶有 size() 方法的物件,用于重新調整字串的長度。
“string_ptr”是指向 std::string 的指標,即指向物件的指標。因為它是一個指向物件的指標,所以你不使用 text.size() 來獲取長度,而是使用 string_ptr->size()。
所以首先,不,您不能將指標與整數常量進行比較,只能與 NULL 或其他指標進行比較。
第一次增加 string_ptr 時,它指向變數 text 之后的記憶體。那時使用 *string_ptr 進行任何操作都會崩潰。
記住:std::string 是一個物件。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/452329.html
