检查字符串中的字符

时间:2015-11-26 06:30:34

标签: c++ string

我有一个基本的问题,我想要检查字符串是否包含小写或大写字母。我使用了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语句中定义的小写或大写字母?我很感激,如果有人可以通过一个例子为我阐明一点。

6 个答案:

答案 0 :(得分:1)

你必须使用for循环通过char

检查字符串char
bool 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]).+$

See live demo

请注意,此解决方案仅限于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