2016-12-06 13 views
3
내가 실제로 C++ 반전 문자열/문자 [] 방법

C++에서 원하는대로 수행 | 숯불 [] cout을하고 반전 문자 []

#include <iostream> 

using namespace std; 

void inverse(string input) 
{ 
    int length = input.length(); 
    char* output = new char[length]; 

    for(int i = 0; i < length; i++) 
    { 
     output[length - (i + 1)] = input[i]; 
    } 

    cout << output << endl; 
    delete output; 
} 

int main(int argc, char *argv[]) 
{ 
    while(true) 
    { 
     string in; 
     cin >> in; 
     inverse(in); 
    } 

    return 0; 
} 

내가 3/5/7 등으로 문자열을 입력 할 때 문제가있다 일하고 있어요

글자에 다음 역전됩니다, 그렇다면,하지만 만약 내가 2/4/6의 문자열 길이를 입력하면 거기에 문자를 반전 문자열은 자신의 그리고 난 단지 이러한 길이의 길이를 입력 임의의 문자가 있습니다.

이 오류는 짝수에만 표시되기 때문에 혼란 스럽습니다. 여기 Here's a little example:

가 (모든 것이 여기 잘 작동), 내가 그것을 배열의 끝에서/0 함께 할 수있는 뭔가 그런데 왜에만 짝수 번호가 알고있는 새로운 코드 : 여기

조금 예제 .

#include <iostream> 

using namespace std; 

void inverse(string input) 
{ 
    int length = input.length(); 
    char* output = new char[length + 1]; 

    for(int i = 0; i < length; i++) 
    { 
     output[length - (i + 1)] = input[i]; 
    } 

    output[length] = '\0'; 
    cout << output << endl; 
    delete output; 
} 

int main(int argc, char *argv[]) 
{ 
    while(true) 
    { 
     string in; 
     cin >> in; 
     inverse(in); 
    } 

    return 0; 
} 

아무에게도 해결책을 찾을 수 있습니까?

+1

처음에는'#include '이 누락되었습니다. 또한 조회 : ['std :: reverse'] (http://en.cppreference.com/w/cpp/algorithm/reverse). – rubenvb

+1

'std :: string output (length + 1, 0);'대신'char * output = new char [length + 1];'을 쓰면,'std :: string'을 인수로 사용하게됩니다. –

+0

나는 Ralph Tandetzky Answer에 동의한다. 응용 프로그램에서 메모리 누수가 발견되어 전체 배열을 삭제해야합니다. 'delete output;은'delete [] output'이어야합니다. –

답변

3

문자열이 null로 종료되지 않습니다. 일이 들어

void inverse(string input) 
{ 
    reverse(input.begin(), input.end()); 
    cout << input << endl; 
} 

을 시도, 당신은 std::reverse() 기능을 정의하는 algorithm 헤더를 포함해야합니다.

짝수로는 작동하지 않는 이유는 메모리 할당이 대개 약간의 메모리를 예약하므로 메모리 경계가 올바르게 정렬되기 때문입니다. 따라서 짝수로 반올림하는 것은 낭비가 아닙니다. 그것은 단지 추측입니다. 그러나 정의되지 않은 동작은 피하는 것이 좋습니다.

0

\0으로 끝나지 않았기 때문에 문자열 끝에 쓰레기가 있습니다. 이러한 문자열을 인쇄하는 것은 C++에서 정의되지 않은 동작입니다.

코드가 짝수 일 경우 행운이었습니다. 예를 들어, 내 컴퓨터에서 1,2,3,5,6,7 및 8의 길이에 적합하고 4에 대해 쓰레기를 인쇄합니다.

UP : 실제로 UB를 피하십시오. 표준은 UB가있을 때 일어나는 일을 지정하지 않습니다. 이론적으로 프로그램이 충돌하거나 컴퓨터가 폭발하거나 코에서 악마가 나타날 수 있습니다. 이 특별한 경우에 output에 대한 컨테이너로 std::string을 사용하는 것이 좋습니다. 어떤 이유로 든 std::reverse을 사용하거나 수동으로 모든 작업을 수행 할 수 없습니다.