首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C++ string::find 返回 npos 而非 -1,條件判斷陷阱解析

     編輯:程式設計疑難解答

核心誤區

代碼中出現:

if (str.find("abc") != -1) { ... } // 錯誤寫法

標準規定:std::string::find 未找到時返回 std::string::npos,其類型為 size_type(無符號整數),數值通常為 static_cast(-1)(即最大值 0xFFFFFFFF...)。

為什麼 -1 會「不小於 length」?

  • str.length() 返回 size_type(無符號)。
  • 字面量 -1 是有符號 int。
  • 比較時發生隱式類型轉換:-1 轉為無符號變成巨大的正數(UINT_MAX),遠大於任何字符串長度。
  • 導致 if (pos != -1) 恆為 true(因為 npos == (size_t)-1),if (pos < str.length()) 恆為 false。

標準正確寫法

size_t pos = str.find("abc");
if (pos != std::string::npos) { // 找到
    // pos 是首次出現位置
}
if (pos == std::string::npos) { // 未找到
}

補充:C++20 新增 contains 更直觀

if (str.contains("abc")) { ... } // C++20 起支持

避坑清單

  1. 永遠用 npos 比較,別用 -1、0、NULL。
  2. find 返回類型是 size_t,別存入 int 截斷。
  3. rfind、find_first_of 等同理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved