2012-05-28 3 views
3

C++의 std :: string에서 모든 구두점 문자를 제거하려고합니다. 현재 사용중인 코드 :C++에서 std :: string을 종료하는 방법은 무엇입니까?

string str_in; 
string::size_type i, j; 

cout << "please input string with punctuation character..." << endl; 
cin >> str_in; 

for (i = 0, j = 0; i != str_in.size(); ++i) 
    if (!ispunct(str_in[i])) 
     str_in[j++] = str_in[i]; 

str_in[j] = '\0'; 

cout << str_in << endl; 

str_in[j] = '\0';은 잘못된가요?

+0

을 그에게 적절한 방법이 아니다 이후 나는'str_in [J] = '이 \ 0''이 잘못 동의 'std :: string'을 종료하십시오. 질문은 무엇입니까? – jamesdlin

+0

C++에서 std :: string을 종료하는 방법 – iverson

+0

질문을 바꾸면 도움이 될 것입니다. C 스타일 문자열과는 달리,'std :: string'은 종결자를 사용하도록 정의되지 않습니다. 난 당신이'std :: string'에서 모든 구두점을 지우려고하고 있다고 생각합니다. 그래서 "foo.bar + baz"는''foobarbaz ''가됩니다. 그렇다면 해지와 아무런 관련이 없습니다. –

답변

4

str_in을 첫 번째 j 자로 자르려면 str_in.resize(j)이라고 말할 수 있습니다. 당신이 표준 라이브러리를 사용하려면

는이 같은 erase-remove 관용구 적용 할 수 :

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

int main() 
{ 
    std::string str_in; 
    std::getline(std::cin, str_in); 

    // Here is where the magic happens... 
    str_in.erase(std::remove_if(str_in.begin(), str_in.end(), ::ispunct), str_in.end()); 

    std::cout << str_in << '\n'; 

    return 0; 
} 
+0

물론이 erase/remove_if 숙어는 C++에서이 문제를 해결하는 유일한 방법입니다. 그러나':: ispunct'를 술어로 전달하면 정의되지 않은 동작이 발생합니다. 왜냐하면 안전하게':: ispunct'를'char'로 호출 할 수 없기 때문입니다. (':: ispunct'에 대한 입력은'[0, UCHAR_MAX]'범위 내에 있거나'EOF'이어야합니다.) –

0

문자열에 구두점이없는 경우 str_in[j] = '\0'이 잘못되었다고 생각합니다.

+0

어쨌든'std :: string'을 종료하는 것은 적절하지 않습니다. 'str_in.size()'는 잘못된 값을 반환합니다. – jamesdlin

+0

이 방법은 C에서 유용하지만 C++에서는 작동하지 않습니다! – iverson

+0

@jamesdlin 오, 네. 그것은 std :: string, char []가 아닙니다. 나는 그것을 잊어 버린다. – RolandXu

0

대신 같은 문자열을 수정하는 (예 str_out)을 새 문자열을 만들고 해당에 추가 :

str_out += str_in[i]; 
+0

나는이 방법을 안다, 나는 단지 ** 동일한 ** 문자열을 사용하여 그 기능을 달성하고자한다. – iverson

+0

@iverson 그런 다음 완료되면'str_in'으로 복사하거나 ['substr'] (http://en.cppreference.com/w/cpp/string/basic_string/substr)을 사용하십시오 :'str_in = str_in.substr (0 , j);' –

+2

아니면 그냥'str_in.resize (j)'라고 말하십시오. – Blastfurnace

1

는 C++ 문자열 유형은 널 (종료 될 구현되지 않은 c_str() 전화 것이다하지만 당신에게 널 종료 문자열을 제공)

그래서 예, str_in[j] = '\0' 적어도 두 가지 이유로 잘못이다.

    ,
  1. str_in.length()은 구두점이 제거 된 것으로 예상되는 문자열의 크기를 반영하지 않습니다.
  2. 널 charatcter는 출력 스트림으로 전송됩니다 추가 헌장,
    같은 아마 같은 버퍼를 oveeride해서는 안 std::string 클래스를 사용

cout << str_in;로하지만, 아마도 대신 str_out 버퍼를 사용하는 원하는 모든 문자 (예 : 구두점 문자 제외)를 복사 한 후에 올바른 길이를 갖게되거나 null을 추가하는 대신 str_in의 길이를 조정해야합니다.

관련 문제