2011-03-09 6 views
5

문자열의 모든 공백을 밑줄로 대체하는 내용을 작성하려고합니다.공백을 밑줄로 바꾸기

내가 지금까지 가지고있는 것.

string space2underscore(string text) 
{ 
    for(int i = 0; i < text.length(); i++) 
    { 
     if(text[i] == ' ') 
      text[i] = '_'; 
    } 
    return text; 
} 

내가 좋아하는 일을하는 경우 대부분 작동합니다.

string word = "hello stackoverflow"; 
word = space2underscore(word); 
cout << word; 

"hello_stackoverflow"가 출력됩니다. 이는 내가 원하는 것입니다. 내가

string word; 
cin >> word; 
word = space2underscore(word); 
cout << word; 

처럼 뭔가를했다 경우

하지만 난 그냥 "안녕하세요", 첫 번째 단어를 얻을 것입니다.

아무도이 문제를 해결할 수 있습니까?

답변

13

문제는 cin >> word은 첫 번째 단어 만 읽는 것입니다. 한 번에 전체를 조작하려면 std::getline을 사용해야합니다. 예를 들어

는 :

또한
std::string s; 
std::getline(std::cin, s); 
s = space2underscore(s); 
std::cout << s << std::endl; 

, 당신은 당신이 실제로 라인을 읽을 수 있다고 확인 할 수 있습니다. 이 같은이 작업을 수행 할 수 있습니다

std::string s; 
if(std::getline(std::cin, s)) { 
    s = space2underscore(s); 
    std::cout << s << std::endl; 
} 

마지막으로, 보조 노트로, 당신은 아마 깨끗한 방법으로 함수를 작성할 수 있습니다. 개인적으로 다음과 같이 작성합니다 :

보너스 포인트는 std::transform입니다!

편집 : 당신이 C + +0 기능을 사용할 수있을만큼 운이 될 일이 (내가 그 경우 큰 알고) 아주 간단한 코드를 초래하는, 당신은 람다 및 std::transform를 사용할 수있는 경우 :

std::string s = "hello stackoverflow"; 
std::transform(s.begin(), s.end(), s.begin(), [](char ch) { 
    return ch == ' ' ? '_' : ch; 
}); 
std::cout << s << std::endl; 
+0

미안하지만, 당신이'std ::'를 사용하든 안하든 섞어 버리고 있습니다. (기술적으로 코드는 맨 위의'std :: cout;'과 함께 작동한다.) –

+0

@Platinum Azure : 네가 맞다. 개인적으로 나는 명시 적으로'std ::'를 사용하고 싶지만, 나는 OP의 코드 중 일부를 내 예. 내가 정리할거야. –

+0

고마워요! 내 프로그램은 이제 괜찮아 :) –

5

문제는 iostream 라이브러리에서 std::cin의 이해에있다 : 단 (분리 공백을 사용하여) 한 번에 하나 개의 단어를 취 오른쪽 측면 인수로 std::string와 스트림에 >> 연산자를 사용.

대신 문자열을 얻기 위해 std::getline()을 사용하고 싶습니다.

-1

교체

cin >> word; 

getline(cin, word); 
으로
10

getline 문제가 해결되었지만 표준 라이브러리에 많은 유용한 기능이 포함되어 있다고 말하고 싶습니다.핸드 롤 루프 대신 다음을 수행 할 수 있습니다.

std::string space2underscore(std::string text) 
{ 
    std::replace(text.begin(), text.end(), ' ', '_'); 
    return text; 
} 

이 작업은 빠르며 실제로 무엇을하고 있는지 표현합니다.

0

최신 C++ 1x 접근 방식의 경우 std::regex_replace 옵션이 있습니다.

#include <regex> 
#include <string> 
#include <cstdlib> 
#include <iostream> 

using std::cout; 
using std::endl; 
using std::regex; 
using std::string; 
using std::regex_replace; 

int main(const int, const char**) 
{ 
    const auto target = regex{ " " }; 
    const auto replacement = string{ "_" }; 
    const auto value = string{ "hello stackoverflow" }; 

    cout << regex_replace(value, target, replacement) << endl; 

    return EXIT_SUCCESS; 
} 

프로 : 적은 코드입니다.

단점 : 정규 표현식이 의도를 흐리게 만들 수 있습니다.

관련 문제