Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > C++ > case insensitive string::find

Reply
Thread Tools

case insensitive string::find

 
 
=?ISO-8859-1?Q?=22Nils_O=2E_Sel=E5sdal=22?=
Guest
Posts: n/a
 
      10-19-2004
Is there some quick C++ way I can do something similar to string::find ,
but case insensitive ?
 
Reply With Quote
 
 
 
 
John Harrison
Guest
Posts: n/a
 
      10-19-2004

"Nils O. Selåsdal" <(E-Mail Removed)> wrote in message
news:b_5dd.2715$(E-Mail Removed)...
> Is there some quick C++ way I can do something similar to string::find ,
> but case insensitive ?


You can use the predicate version of std::search

bool ci_equal(char ch1, char ch2)
{
return toupper((unsigned char)ch1) == toupper((unsigned char)ch2);
}

size_t ci_find(const string& str1, const string& str2)
{
string::iterator pos = search(str1. begin ( ), str1. end ( ), str2.
begin ( ), str2. end ( ), ci_equal);
if (pos == str1. end ( ))
return string::npos;
else
return pos - str1. begin ( );
}

Untested code.

John


 
Reply With Quote
 
 
 
 
=?ISO-8859-1?Q?=22Nils_O=2E_Sel=E5sdal=22?=
Guest
Posts: n/a
 
      10-19-2004
John Harrison wrote:
> "Nils O. Selåsdal" <(E-Mail Removed)> wrote in message
> news:b_5dd.2715$(E-Mail Removed)...
>
>>Is there some quick C++ way I can do something similar to string::find ,
>>but case insensitive ?

>
>
> You can use the predicate version of std::search
>
> bool ci_equal(char ch1, char ch2)
> {
> return toupper((unsigned char)ch1) == toupper((unsigned char)ch2);
> }
>
> size_t ci_find(const string& str1, const string& str2)
> {
> string::iterator pos = search(str1. begin ( ), str1. end ( ), str2.
> begin ( ), str2. end ( ), ci_equal);
> if (pos == str1. end ( ))
> return string::npos;
> else
> return pos - str1. begin ( );
> }
>
> Untested code.

Change to string::const_iterator, it seems to work fine.
Thanks.
 
Reply With Quote
 
Malte Starostik
Guest
Posts: n/a
 
      10-19-2004
John Harrison schrieb:

> "Nils O. Selåsdal" <(E-Mail Removed)> wrote:
>
>>Is there some quick C++ way I can do something similar to string::find ,
>>but case insensitive ?

>
>
> You can use the predicate version of std::search
>
> bool ci_equal(char ch1, char ch2)
> {
> return toupper((unsigned char)ch1) == toupper((unsigned char)ch2);
> }


Caveat: that predicate will not work reliably for non-English strings.
e.g. in French accents are usually stripped off of capital letters, so
an 'E' can be equivalent (equal modulus case) to either 'e', 'é', 'è',
or 'ê'. In German, the letter 'ß' only exists in lower case, and the
correct capitalisation is "SS", while the reverse conversion is
ambiguous (some "SS" convert to "ss", others to 'ß').

It still doesn't catch all of those issues, but in most cases tolower()
is the better variant in my experience.

While 100% correct case conversions cannot be done in some languages
without knowledge of their spelling rules and exceptions to them, the
'ß' case IMHO shows that signatures like charT toupper( charT ) have
been designed with ignorance (no offence) towards languages where a
1-char-to-1-char conversion is not possible. Wide character support
doesn't alleviate this at all ((
Standardised whole-string case conversion functions would be deerly
needed, even if it's left to the implementation or the application to
implement them for a particular locale.

Regards,
Malte
 
Reply With Quote
 
=?iso-8859-1?q?Nils_O=2E_Sel=E5sdal?=
Guest
Posts: n/a
 
      10-19-2004
On Tue, 19 Oct 2004 15:03:14 +0200, Malte Starostik wrote:

> John Harrison schrieb:
>
>> "Nils O. Selåsdal" <(E-Mail Removed)> wrote:
>>
>>>Is there some quick C++ way I can do something similar to string::find ,
>>>but case insensitive ?

....
> 1-char-to-1-char conversion is not possible. Wide character support
> doesn't alleviate this at all ((
> Standardised whole-string case conversion functions would be deerly
> needed, even if it's left to the implementation or the application to
> implement them for a particular locale.

Fortunatly for me, I need only care about ascii a-z,A-Z ..


 
Reply With Quote
 
Siemel Naran
Guest
Posts: n/a
 
      10-20-2004
"Nils O. Selåsdal" <(E-Mail Removed)> wrote in message news:b_5dd.2715

> Is there some quick C++ way I can do something similar to string::find ,
> but case insensitive ?


See John's post for an excellent solution.

A more elaborate possibility is to create a new traits class, similar to
std::char_traits<char>, that compares without sensitivity. But now all
string compare operations are case insensitive, so you might find yourself
trying to use std::search to compare with case sensitivity! I haven't tried
myself yet, but seems this should work:

class ichar_traits : public std::char_traits<char> {
public:
static bool eq(char, char);
static bool lt(char, char);
static int compare(const char *, const char *, size_t n);
static const char * find(const char *, size_t n, char);
};

std::basic_string<char, ichar_traits<char> > s1("Hello");
std::basic_string<char, ichar_traits<char> > s2("HELLO");
assert(s1==s2);
assert(s1.find(s2)==0);


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
check file exists with case sensitive on a case insensitive filesystem Xah Lee Perl Misc 4 04-05-2009 11:21 PM
string.indexof case insensitive Guoqi Zheng ASP .Net 4 01-25-2009 02:07 AM
case insensitive find on case sensitive stl map benhoefer@gmail.com C++ 1 04-06-2007 08:42 PM
how to case select with case-insensitive string ? Tee ASP .Net 3 06-23-2004 07:40 PM
searching lines case-insensitive James Hunt Perl 4 06-05-2004 06:13 PM



Advertisments