2017-09-27 1 views
-3

문자열을 취하는 함수를 만들려고하는데, 그 변환은 모두 main에서 수행됩니다. 여기 내가 지금까지 가지고있는 것이있다.C 스타일 문자열로 변환

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


std::string str = "zombie"; 


void Reverse(std::string a) 
{ 

    char* a1 = a.c_str; 
    char* a2; 

    for (int i = (strlen(a1) -1); a1[i]!=0; i--) 
    { 
     a2 += a1[i]; 
    } 

    str = a2; 
} 

int main() 
{ 
    Reverse(str); 

    std::cout << str << std::endl; 
} 

하지만이 오류가 계속 발생합니다. 이 질문에 포인터를 사용할 수 없습니다. 어떤 제안?

편집 : 특히 삽입 된 매개 변수를 C 스타일 문자열로 변환하는 데 문제가 있습니다.

EDIT 2 : 내가 이해할 수 있도록 코드를 수정하기 시작했습니다. 적절한 코드를 사용하여도 목표를 달성하지 못했습니다. 이게 더 나은 방향일까요? 함수에 전달하기 전에 문자열을 C 스타일로 변환하려고합니다.

void Reverse(const char* s) 
{ 
    int x = strlen(s); 
    std::string str = ""; 

    for (int c = x; c > 0; c--) 
    { 
     str += s[c]; 
    } 

} 

답변

0

이 기능은 완전히 유효하지 않습니다.

예를 들어 매개 변수는 std::string &으로 선언해야합니다.

함수가 전역 변수에 의존 할 때 잘못된 생각입니다. 이 문장

char* a1 = a.c_str; 

에서

는 한 번에 두 가지 오류가 있습니다. 먼저 a.c_str 대신 a.c_str()이어야합니다. 그리고 멤버 함수 c_str은 상수 포인터를 반환합니다.

이 포인터

char* a2; 

은 불확정 값이 있습니다.

이제 C++로 함수를 작성하는 방법에 대해 알지 못해도 구현의 여러 변형을 보여 드리겠습니다.

간단한 한 다음

#include <iostream> 
#include <string> 

std::string & Reverse(std::string &s) 
{ 
    s.assign(s.rbegin(), s.rend()); 

    return s; 
} 


int main() 
{ 
    std::string s = "zombie"; 

    std::cout << s << std::endl; 
    std::cout << Reverse(s) << std::endl; 

    return 0; 
} 

함수가 class std::string의 반전 반복기를 사용한다.

또 다른 방법은 당신 자신이 루프를 사용하여 함수를 작성하려면 <algorithm>

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

std::string & Reverse(std::string &s) 
{ 
    std::reverse(s.begin(), s.end()); 

    return s; 
} 

int main() 
{ 
    std::string s = "zombie"; 

    std::cout << s << std::endl; 
    std::cout << Reverse(s) << std::endl; 

    return 0; 
} 

다음의 구현에

#include <iostream> 
#include <string> 


std::string & Reverse(std::string &s) 
{ 
    for (std::string::size_type i = 0, n = s.size(); i < n/2; i++) 
    { 
     //std::swap(s[i], s[n - i - 1]); 
     char c = s[i]; 
     s[i] = s[n - i - 1]; 
     s[n - i - 1] = c; 
    } 

    return s; 
} 

int main() 
{ 
    std::string s = "zombie"; 

    std::cout << s << std::endl; 
    std::cout << Reverse(s) << std::endl; 

    return 0; 
} 

처럼 보일 수있는 헤더에 선언 된 표준 알고리즘 std::reverse을 사용하는 것입니다 프로그램 출력이 3 가지 경우 모두

zombie 
eibmoz 

인덱스 대신에 반복자 (양방향 또는 무작위)를 사용하여 함수를 직접 작성할 수도 있습니다.

관련 문제