2013-11-09 6 views
1

문장을 대문자에서 소문자로 변환하려고합니다. 나는 또한 코드를 쓰지만 공간이 나타날 때 나는 멈춘다. 이 문제를 해결하고 전체 문장을 어떻게 변환 할 수 있습니까? 여기이 공간을 나누기 때문에 theinput 운영자 >>의 내 코드문장을 대문자에서 소문자로 변환하는 방법

#include<iostream> 
#include<cstring> 
using namespace std; 
int main() 
{ 
    char str[100]; 
    cin>>str; 
    for(int i=0;i<strlen(str);i++) 
    { 
     if(str[i]>='A'&&str[i]<='Z') 
     { 
      str[i]=str[i]+32; 
     } 
    } 
    cout<<str<<endl; 
    return 0; 
} 
+0

'std :: transform' 또는 이미 만들어진 Boost 알고리즘을 사용하십시오. 그리고'std :: string'을 사용하십시오; 당신은 버퍼 오버런을 요구하고 있습니다. – chris

+0

OP, 나는이 경험이 공백에 너를 괴롭 히지 않았 으면 좋겠다. 왜냐하면 코드가 가독성을 위해 조금 더 사용할 수 있기 때문이다. – Duck

+0

이 코드는 'A'-'Z' 문자가 인접한 값을 가지고 있다고 가정하고'a'-'z' 문자는 연속적인 값을 가지며 32 문자를 추가하여 문자를 소문자로 변환 할 수 있다고 가정합니다. 모든 문자 집합에 대해 사실이 아닙니다. 표준 라이브러리에서'to lower '에 대해 읽으십시오. –

답변

0

오류는 operator>>이 공백을 구분하기 때문에 발생합니다. 대안은 getline을 사용하는 것입니다. 다음 예를 참조하십시오 서식 입력이 (다른 사람의 사이에서) 공백 문자로 구분되어 있기 때문에

#include <cstring> 
#include <iostream> 
#include <string> 

int main() { 
    std::string s; 

    std::getline(std::cin, s); 

    std::cout << "Original string: " << s << std::endl; 

    if (!std::cin.fail()) { 
    const int len = strlen(s.c_str()); 

    for (size_t i = 0; len > i; ++i) { 
     if ((s[i] >= 'A') && (s[i] <= 'Z')) 
     s[i] = s[i] - 'A' + 'a'; 
    } 
    } 

    std::cout << "New string: " << s << std::endl; 

    return 0; 
} 
0

이유 입력이 공백에서 정지 같습니다. 전체 문자열을 str으로 추출하려면 형식화되지 않은 I/O가 필요합니다. 이 작업을 수행하는 한 가지 방법은 사용하는 것입니다 std::istream::getline :

std::cin.getline(str, 100, '\n'); 

그것은 입력이 gcount를 사용하여 성공 여부를 확인하는 것이 유용하다 :

if (std::cin.getline(str, 100, '\n') && std::cin.gcount()) 
{ 
    ... 
} 

그러나

실제로 당신이 표준 문자열 객체를 사용하는 것이 좋습니다 std::string 동적 버퍼를 유지합니다. 여기

std::string str; 

if (std::getline(std::cin, str) 
{ 
    ... 
} 
0

transform 기능을 사용하여 그 일의 사례 중 하나입니다 : 당신이 std::getline를 사용하는 전체 입력을 추출합니다.

#include <iostream> 
#include <string> 
#include <algorithm> 

using namespace std; 

int main() 
{ 
    string str; 

    if (getline(cin, str)) 
    { 
     transform(str.begin(), str.end(), str.begin(), ptr_fun<int, int>(toupper)); 
    } 

    cout << str << endl; 
    return 0; 
} 
관련 문제