2012-02-07 3 views
6

문자열을 반복하거나 대다수의 경우 good one에 대문자와 소문자를 구별하는 방법이 있습니다. 다른 라이브러리가 필요합니다. 설치하지 않은 다른 컴퓨터에이 파일을 저장해야합니다. 표준 라이브러리를 사용하여이 작업을 수행 할 수 있습니까? 지금 방금하고 있습니다 ...대소 문자를 구별하지 않는 문자열 비교 C++

if (foo == "Bar" || foo == "bar") 
{ 
cout << "foo is bar" << endl; 
} 

else if (foo == "Stack Overflow" || foo == "stack Overflow" || foo == "Stack overflow" || foo == "etc.") 
{ 
cout << "I am too lazy to do the whole thing..." << endl; 
} 

이렇게하면 코드의 가독성과 유용성이 크게 향상 될 수 있습니다. 지금까지 읽어 주셔서 감사드립니다.

+2

심각하게? 비록 내장 된 방법이 없다고해도, 당신은 각자의 비교를 강요하는 것보다는 그것을하기위한 함수를 쉽게 작성할 수 있습니다. 문자열을 반복하는 것이 잘못된 이유는 무엇입니까? 그것이 여러분이 사용하려고하는 라이브러리가 어쨌든 할 일입니다. –

+3

stricmp는 모든 곳에서 사용할 수 있습니다. – arx

+0

사용할 수있는 표준 라이브러리는 바이너리를 컴파일 할 때 사용할 C++ 컴파일러 버전에 따라 다릅니다. 예를 들어, C++ 0x는 정규 표현식을 지원합니다. 오래된 컴파일러의 경우 stricmp를 사용할 수 있습니다. – Alan

답변

15

strncasecmp

,

strcasecmp() 함수는 문자의 대소 문자열 S1과 S2바이트 단위로 비교를 행한다. s1이 각각보다 작거나 같거나 일치하거나 s2보다 큰 경우 0보다 작거나 같은 정수 또는 큰 값을 반환합니다. 이 S1과 S2의 이하 N 바이트 ...

+0

감사합니다. – CoffeeRain

+3

@ Coffee Rain : 대단히 환영합니다! 나는 당신이 mambo-jumbo C++ macaroni에 비해 간단한 오래된 학교 C 함수를 좋아했기 때문에 기쁩니다 :) –

+0

공백으로되어 있습니까? – nfoggia

2

당신은 왜 모든 것을 소문자로 만들고 비교합니까?

tolower()

int counter = 0; 
    char str[]="HeLlO wOrLd.\n"; 
    char c; 
    while (str[counter]) { 
    c = str[counter]; 
    str[counter] = tolower(c); 
    counter++; 
    } 

    printf("%s\n", str); 
+0

나는 그것을 시도했지만 잘 작동하지 않았습니다. 예제를 제공해 줄 수 있습니까? 내 오류 코드를 게시하려고합니다 ... – CoffeeRain

6

보통 난 그냥 같은 문제의 문자열의 낮은 맡았다 버전, 비교한다 무엇을 : 나는 부스트가 내장되어 소문자로 변환 생각

if (foo.make_this_lowercase_somehow() == "stack overflow") { 
    // be happy 
} 

를, 그래서 :

#include <boost/algorithm/string.hpp>  

if (boost::algorithm::to_lower(str) == "stack overflow") { 
    //happy time 
} 
+0

부스트는 제가 연결 한 것입니다 ... 나는 그것을 가지고 있지 않습니다. – CoffeeRain

+0

부스트는 모든면에서 자유 롭습니다. 어떤 이유로 든 설치할 수 없다면 to_lower 알고리즘을 가져올 수 있습니다. –

+1

'to_lower'의 반환 값은 void입니다. 먼저 to_lower를 적용한 다음 평소와 비교해야합니다. gcc에서 위의 코드는 '오류가 발생하지 않아야하므로 무시되지 않는 무효 값'을 제공합니다. – Fadecomic

2

당신이 기존의 문자열을 변환하는 간단한 기능을 쓸 수를 비교하는 것을 제외

strncasecmp() 기능은 비슷합니다 소문자를 다음과 같이

#include <string> 
#include <ctype.h> 
#include <algorithm> 
#include <iterator> 
#include <iostream> 

std::string make_lowercase(const std::string& in) 
{ 
    std::string out; 

    std::transform(in.begin(), in.end(), std::back_inserter(out), ::tolower); 
    return out; 
} 

int main() 
{ 
    if(make_lowercase("Hello, World!") == std::string("hello, world!")) { 
    std::cout << "match found" << std::endl; 
    } 

    return 0; 
} 
2

난 그냥 쓴, 어쩌면 누군가에게 도움이 될 수 있습니다

int charDiff(char c1, char c2) 
{ 
    if (tolower(c1) < tolower(c2)) return -1; 
    if (tolower(c1) == tolower(c2)) return 0; 
    return 1; 
} 

int stringCompare(const string& str1, const string& str2) 
{ 
    int diff = 0; 
    int size = std::min(str1.size(), str2.size()); 
    for (size_t idx = 0; idx < size && diff == 0; ++idx) 
    { 
     diff += charDiff(str1[idx], str2[idx]); 
    } 
    if (diff != 0) return diff; 

    if (str2.length() == str1.length()) return 0; 
    if (str2.length() > str1.length()) return 1; 
    return -1; 
} 
관련 문제