td::string::find() 和 std::string::npos

本文详细解析了C++中字符串find()函数的用法及其与npos的正确结合方式,阐述了将idx定义为int或unsigned int的错误性,并强调了使用string::size_type类型的重要性以避免比较时的类型不匹配问题。通过实例代码演示了如何正确地判断find()函数返回的是否为npos,确保程序的稳定性和可靠性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
int idx = str.find("abc");
if (idx == string::npos)
  ...
 
上述代码中,idx的类型被定义为int,这是错误的,即使定义为 unsigned int 也是错的,它必须定义为 string::size_type。
 
npos 是这样定义的:
static const size_type npos = -1;
 
因为 string::size_type (由字符串配置器 allocator 定义) 描述的是 size,故需为无符号整数型别。因为缺省配置器以型别 size_t 作为 size_type,于是 -1 被转换为无符号整数型别,npos 也就成了该型别的最大无符号值。不过实际数值还是取决于型别 size_type 的实际定义。不幸的是这些最大值都不相同。事实上,(unsigned long)-1 和 (unsigned short)-1 不同(前提是两者型别大小不同)。因此,比较式 idx == string::npos 中,如果 idx 的值为-1,由于 idx 和字符串string::npos 型别不同,比较结果可能得到 false。
 
要想判断 find() 的结果是否为npos,最好的办法是直接比较:
if (str.find("abc") == string::npos) { ... }
 
(EOF)

2013-12-06 10:33:10|  分类: c/c++|举报|字号 订阅

from:http://www.cplusplus.com/reference/string/string/getline/

(1)
istream& getline (istream& is, string& str, char delim);
(2)
istream& getline (istream& is, string& str);

 
Get line from stream into string

Extracts characters from is and stores them into str until the delimitation character delim is found (or the newline character,'\n', for (2)).

The extraction also stops if the end of file is reached in  is or if some other error occurs during the input operation.

If the delimiter is found, it is extracted and discarded, i.e. it is not stored and the next input operation will begin after it.

Each extracted character is appended to the  string as if its member  push_back was called.


void IPCAPPCONTEXT::SetupDomain() { // readFile std::string strLogSettingFileName = ""; bool bPlaybackCacheEnable = false; std::string strPlaybackCacheKey = "PLAYBACK_CACHE_ENABLE"; /* * DEBUG下调试时,读取文件的相对位置以当前main.cpp文件为准,所以需要使用绝对路径,通过点击EXE启动时, * 可以使用相对EXE文件的路径位置 */ #ifdef _DEBUG strLogSettingFileName = TPWLogger::getInstance()->getExePath() + "\\" + VMS_LOG_SETTING_FILE_NAME; #else strLogSettingFileName = VMS_LOG_SETTING_FILE_NAME; #endif // _DEBUG std::string strKey = VMS_ENVIRONMENT_KEY; VMS_ENVIRONMENT_TAG eEnvTag = VMS_ENVIRONMENT_TAG::PRD; std::ifstream inputFile(strLogSettingFileName); if (!inputFile.is_open()) { SetupPRDDomain(); return; } std::string line = ""; bool bFoundEnvKey = false; while (std::getline(inputFile, line)) { // 跳过注释行 if (line.empty() || line[0] == '#') { continue; } if (line.find(strKey) != std::string::npos) { bFoundEnvKey = true; if (line.find(VMS_ENVIRONMENT_VALUE_PRD) != std::string::npos) { eEnvTag = VMS_ENVIRONMENT_TAG::PRD; } else if (line.find(VMS_ENVIRONMENT_VALUE_ALPHA2) != std::string::npos) { eEnvTag = VMS_ENVIRONMENT_TAG::ALPHA2; } else if (line.find(VMS_ENVIRONMENT_VALUE_ALPHA3) != std::string::npos) { eEnvTag = VMS_ENVIRONMENT_TAG::ALPHA3; } else if (line.find(VMS_ENVIRONMENT_VALUE_ALPHA) != std::string::npos) { eEnvTag = VMS_ENVIRONMENT_TAG::ALPHA; } else if(line.find(VMS_ENVIRONMENT_VALUE_BETA2) != std::string::npos) { eEnvTag = VMS_ENVIRONMENT_TAG::BETA2; } else if (line.find(VMS_ENVIRONMENT_VALUE_BETA3) != std::string::npos) { eEnvTag = VMS_ENVIRONMENT_TAG::BETA3; } else if(line.find(VMS_ENVIRONMENT_VALUE_BETA) != std::string::npos) { eEnvTag = VMS_ENVIRONMENT_TAG::BETA; } else if (line.find(VMS_ENVIRONMENT_VALUE_STAGING) != std::string::npos) { eEnvTag = VMS_ENVIRONMENT_TAG::STAGING; } else if (line.find(VMS_ENVIRONMENT_VALUE_PET) != std::string::npos) { eEnvTag = VMS_ENVIRONMENT_TAG::PET; } } else if (line.find(strPlaybackCacheKey) != std::string::npos) { if (line.find("TRUE") != std::string::npos) { bPlaybackCacheEnable = true; } else if (line.find("FALSE") != std::string::npos) { bPlaybackCacheEnable = false; } } } inputFile.close(); playbackCacheEnabled(bPlaybackCacheEnable); switch (eEnvTag) { case VMS_ENVIRONMENT_TAG::PRD: { SetupPRDDomain(); break; } case VMS_ENVIRONMENT_TAG::ALPHA: { SetupAlphaDomain(); break; } case VMS_ENVIRONMENT_TAG::ALPHA2: { SetupAlpha2Domain(); break; } case VMS_ENVIRONMENT_TAG::ALPHA3: { SetupAlpha3Domain(); break; } case VMS_ENVIRONMENT_TAG::BETA: { SetupBetaDomain(); break; } case VMS_ENVIRONMENT_TAG::BETA2: { SetupBeta2Domain(); break; } case VMS_ENVIRONMENT_TAG::BETA3: { SetupBeta3Domain(); break; } case VMS_ENVIRONMENT_TAG::STAGING: { SetupStagingDomain(); break; } case VMS_ENVIRONMENT_TAG::PET: { SetupPETDomain(); break; } default: SetupPRDDomain(); break; } } 解释这段代码
最新发布
08-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值