我有一个基本的问题,我想要检查字符串是否包含小写或大写字母。我使用了islower()
和find()
,但我没有得到理想的结果。
#include <iostream>
#include <cctype>
using namespace std;
int main()
{
string str1 = "";
cout << "Enter phrase: ";
getline(cin, str1);
// Using islower()
if (!(islower(str1)))
{
cout << "No lowercase character found.";
}
else
{
cout << "Lowercase character found.";
}
/* *************************************** */
// Using find()
string lower = "abcdefghijklmnopqrstuvwxyz";
// string upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
if (!(str1.find(lower)))
{
cout << "No lowercase character found.";
}
else
{
cout << "Lowercase character found.";
}
// Repeat for uppercase letters
return 0;
}
使用islower()
并不起作用,因为它似乎期待char
而不是string
。使用find()
,我的测试输出始终默认为&#34;找到小写字符。&#34;另外,我已尝试string::find_first_of()
代替find()
,但结果也不好。最后两个方法中的任何一个都不会逐个字符地检查字符串,直到找到if
语句中定义的小写或大写字母?我很感激,如果有人可以通过一个例子为我阐明一点。
答案 0 :(得分:1)
你必须使用for循环通过char
检查字符串charbool hasLower = false;
for(int i = 0; i < strlen(str1); i++) {
if(islower(str1[i]) { //a lowercase char is found
hasLower = true;
break; //stop the for-loop
}
}
答案 1 :(得分:1)
find_if是您应该寻找的功能。当Unary函数返回true时,它会中断并返回迭代器。如果没有找到这样的元素,则该函数最后返回。
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
bool check(char ch)
{
if(islower(ch))
{
return true;
}
return false;
}
int main() {
// your code goes here
string str = "ApPLE";
string::iterator it = find_if(str.begin(),str.end(),check);
if(it!=str.end())
cout<<*it<<endl;
else
cout<<"No lower case character"<<endl;
return 0;
}
答案 2 :(得分:1)
使用std::any_of
。它接受一对迭代器来表示[iter1, iter2)
和第三unary function
中的范围作为谓词来测试范围中的每个元素。
它还有一个清晰的名称来表示是[iter1,iter2]中与predicate
函数匹配的任何元素吗?
bool has_lower(const std::string& str)
{
return std::any_of(str.begin(), str.end(), [](char c){ return std::islower(c); });
}
它的确如下:
while(iter1 != iter2) // search until meet the end
{
if( predicate(*iter1) ) // check is_lower in char level
{
return true; // early return if found
}
iter1++; // move to next character
}
return false; // not found
答案 3 :(得分:0)
没有字符串级函数来检查这种情况。您应该使用islower()和isalnum()函数来检查每个字符的条件。
答案 4 :(得分:0)
根据Paul的建议,您可以使用regex
来实现相同目标。
积极的前瞻是你想要的。以下正则表达式可以解决问题:
^(?=.*[a-z]).+$
请注意,此解决方案仅限于ASCII-7字符集。如果您的输入符合Unicode,则无效。
答案 5 :(得分:0)
无论您使用std::
处理文本,您总是受主机平台的语言环境支持的支配。即使在最新版本中,你从std::
获得的内容根本无法处理Unicode的所有方面。
(我最喜欢的一点是std::toupper()
,它应该将德语小写'ß'
转换为大写"SS"
,但不能,因为它只能返回< em>一个字符。)
基本上只有一个可以处理Unicode的所有方面的库,即ICU 。
有些不幸的是,ICU4C(C / C ++)基本上是ICU4J(Java)的一个端口,因此它有一个非C ++类的API。但请相信我,如果你的代码必须真正用文本工作(而不仅仅是&#34;通过&#34;),你最终会使用ICU库,所以为什么不马上开始使用它?
#include <unicode/unistr.h>
#include <unicode/uchar.h>
#include <iostream>
#include <string>
bool hasLower( std::string str )
{
// This converts str from the platform locale to
// ICU's internal (UTF-16) encoding. You could also
// *specify* the encoding of str explicitly.
icu::UnicodeString ustr( str.c_str() );
// Yes, ICU uses *signed* values here, and non-standard typedefs.
int32_t length = ustr.length();
for ( int32_t index = 0; index < length; ++index )
{
// Using char32At() and moveIndex32() instead of operator[]()
// here so we work on code POINTS and not code UNITS (which
// would fail for anything beyond the Basic Multilingual Plane).
if ( u_islower( ustr.char32At( index ) ) )
{
return true;
}
index = ustr.moveIndex32( index, 1 );
}
return false;
}
int main()
{
std::string str;
std::cout << "Enter phrase: ";
std::getline( std::cin, str );
if ( hasLower( str ) )
{
std::cout << "Lowercase character found.\n";
}
else
{
std::cout << "No lowercase character found.\n";
}
return 0;
}
编译(您的平台相当于)-licuuc
。