[英]Why assigning characters to C++ string results in string having 0 length?
[英]Assigning length of a string to an integer: C++
使用 C++,我想創建一個 for 循環如下( text
是std::string
):
for(int i = text.size(); i >= 0; i--) {
{
請有人幫我理解為什么我的編譯器(Xcode)要求我將i
初始化為無符號長整數,而不是 integer?
我假設以下,但我不知道,我想更好地理解:我相信這與最大值為 2147483647 的 integer 相關,而無符號長整數的最大值為 18,446,744,073,709,551,615。 由於一個字符串最多可以容納 4294967295 個字符,因此使用 integer 是不合適的,因為它的最大值不能代表字符串的最大長度?
最后,unsigned long 數據類型是否合適,還是應該使用 long int?
我修改后的for循環如下:
for(unsigned long i = text.size(); i >= 0; i--) {
}
或者
for(long int i = text.size(); i >= 0; i--) {
}
std::string::size()
返回無符號 integer 類型( std::size_t
)。 更改i
的類型很容易,但引入了另一個問題。 當i
類型為std::size_t
時,循環條件被破壞; 根據定義,無符號類型總是>= 0
還有其他選擇,最直接的是將整個 for 循環修改為:
i
聲明為std::size_t
結果如下所示:
for (std::size_t i = text.size(); i-- > 0;)
{
// use text[i] here
}
這將在循環體中從(text.size()-1)
枚舉到0
(含),然后中斷循環。 即使字符串為空,它也會起作用。
請注意,這樣的 hijinks 是一個更大問題的標志:首先使用了錯誤的構造。 std::string
提供反向迭代器用於向后遍歷字符串內容:
for (auto it = text.rbegin(); it != text.rend(); ++it)
{
// use *it to access each character in reverse order
}
這兩種方法中,首選第二種。
如評論中所述, std::string
class 的size()
成員 function 返回size_t
類型的值。 這種類型的確切性質因平台和編譯器而異,但它始終是無符號類型。 通常,它等效於unsigned long int
或unsigned long long int
。
因此,為避免編譯器警告初始化int i
,您應該將該循環索引聲明為size_t
變量: for (size_t i = text.size(); ...
。
但是,正如評論中所指出的那樣,您的循環測試條件( i >= 0
)就不好了,因為對於任何無符號類型,該條件永遠不會為假。 因此,您應該將該條件更改為i > 0
; 您還應該確保基於i
變量對test
元素的任何訪問都應使用索引值i - 1
(而不僅僅是i
):最后一個元素的size - 1
,第一個元素的大小為0
,所以你的循環將保持以下內容:
for (size_t i = text.size(); i > 0; --i) {
char element = text[i - 1]; // We need to offset our loop index by -1 ...
// Do something with or to 'element'
// ...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.