解决char*隐式转换为bool警告[readability-implicit-bool-conversion]
解决
strchr隐式转换为bool的警告问题 这个警告的根源是:strchr函数返回char*类型的指针,当你直接将其放在if条件中时,编译器会隐式把指针转换成布尔值(非空指针对应true,空指针对应false)。这类隐式转换虽然功能正常,但可读性检查规则会认为它的意图不够明确,因此抛出警告。
两种有效修正方式
1. 显式判断指针非空(推荐)
直接将strchr的返回值与nullptr比较,清晰表达“找到元音字符”的逻辑:
// 替换原来的if语句 if (strchr(is_vowel, s[i]) != nullptr) { ++nrVowels; }
C++中nullptr是类型安全的空指针常量,比传统的NULL更适合用于指针场景。
2. 显式转换为布尔值
如果你想保留“存在即成立”的逻辑,可以用static_cast明确告诉编译器你要进行指针到布尔值的转换:
// 替换原来的if语句 if (static_cast<bool>(strchr(is_vowel, s[i]))) { ++nrVowels; }
修改后的完整代码
#include <iostream> #include <fstream> #include <cstring> using namespace std; bool is_letter(const char s) { return ('a' <= s && s <= 'z') || ('A' <= s && s <= 'Z'); } int main() { const int MAX_LENGTH = 260; const int VOWELS = 11; char is_vowel[VOWELS] = "aeiouAEIOU", s[MAX_LENGTH]; ifstream fin("date.in"); int k; cin >> k; int start = -1,nrVowels = 0, finish = 0, counter = 0; while (!fin.eof()) { fin.getline(s, MAX_LENGTH); int n = strlen(s); int have_word = 0; for (int i = 0; i < n; ++i) { if (is_letter(s[i])) { have_word = 1; // 采用方案1的写法消除警告 if (strchr(is_vowel, s[i]) != nullptr) { ++nrVowels; } if (counter == 0) { start = i; finish = i; ++counter; } else { finish = i; } } else if (have_word == 1) { if (nrVowels >= k) { for (int i = start; i <= finish; ++i) { cout << s[i]; } cout << "\n"; } counter = 0; have_word = 0; nrVowels = 0; } } if (have_word == 1) { if (nrVowels >= k) { for (int i = start; i <= finish; ++i) { cout << s[i]; } cout << "\n"; } counter = 0; nrVowels = 0; finish = 0; } } return 0; }
内容的提问来源于stack exchange,提问作者popescubianca
相关产品推荐
相关产品推荐

