2011-11-08 6 views
1

저는 초보자이며 C++에 대한 책을 읽었으며 함수에 관한 장을 다룹니다. 나는 문자열을 뒤집어서 그것의 복사본을 main으로 반환하고 출력하기를 썼다.C++ 함수에서 문자열 반환

문자열 reverseInput (문자열 입력);

int main() 
{ 
    string input="Test string"; 
    //cin>>input; 
    cout<<reverseInput(input); 
    return 0; 
} 

string reverseInput(string input) 
{ 
    string reverse=input; 
    int count=input.length(); 
    for(int i=input.length(), j=0; i>=0; i--, j++){ 
     reverse[j]=input[i-1]; 
    } 
    return reverse; 
} 

위의 사항이 작동하는 것 같습니다.

string input="Test string"; 

에 :이 변경 후

string input; 
cin>>input; 

, 반대 기능을 대신 전체 문자열의 첫 번째 입력 된 단어의 반대를 반환 나는 다음과 같은 코드를 변경할 때 문제가 발생합니다. 내가 어디로 잘못 가고 있는지 알 수 없다.

마지막으로, 입력 변수의 복사본을 변경하지 않고 참조를 사용하여이 작업을 수행하는보다 우아한 방법이 있습니까?

+0

역 기능에 버그가 있습니다. 'for' 조건으로'i> 0'을 사용해야합니다. 마지막 반복에서'i == 0'과'j == input.length()'결과는'reverse [input.length()] = input [-1]'이며, 둘 다 범위를 벗어납니다. – IronMensan

답변

7

문제는 cin입니다. 첫 번째 공백 문자를 읽은 후 읽기를 중지합니다. 당신은 당신이 원하는 것을 할 getline(cin, input);을 사용할 수 있습니다 http://www.cplusplus.com/doc/tutorial/basic_io/

:

이 튜토리얼의 "CIN 문자열"절을 참조하십시오.

4

cin >> input은 단어를 읽습니다. 전체 라인을 읽으려면 당신의 getline에게

getline(cin, input); 

디버거는이 경우에 매우 유용를 사용해야합니다, 당신은 단지 프로그램을 통해 스테핑 변수의 값을 볼 수 있습니다.

간단한 cout < < 입력; 당신을 도왔을 것입니다.하지만 여전히 디버거를 통합 한 좋은 IDE가 없다면, 당신이 사용할 것을 제안 할 것입니다. Eclipse는 좋은 오픈 소스 다. 비쥬얼 스튜디오 2010 익스프레스는 창문에 있으면 좋고 무료입니다.

+0

입력 해 주셔서 감사합니다. 나는 디버거를 사용할 것이다. – Zubizaretta

4

cin>>input; 단어가 아닌 라인을 읽습니다.

예 : getline(cin, input); 줄을 읽으려면

0

역순 함수의 오류는 아니지만 첫 번째 공백 문자까지만 읽는 istream::operator>>의 표준 동작입니다.

1

올바른 위치 리버스 기능은 이미 여기에 구체적으로 대답했다 : 당신의 코드

How do you reverse a string in place in C or C++?

+1

여전히 문자열을 잘못 읽으므로이 경우 도움이되지 않습니다. –

+0

동의하지만 첫 번째 단어 만 얻는 것은 이미 여러 번 답변되었습니다 :-) – pointer

+0

아, 미안하지만, 나는 그가 명시 적으로 인플레 이스 (in-place) 버전을 요구했음을 압니다. –

1

문제는 문자를 발견까지 std::cin 문자를 읽 인 std::isspace(c) 반환 true합니다. 따라서 공백과 개행 문자는 모두 std::isspace으로 전달 될 때 true을 반환하는 문자입니다.

그래서 당신이 기본적으로 필요하고, std::getline :

std::string input; 
if (std::getline(std::cin, input)) 
{ 
    std::cout << reverseInput(input); 
} 
else 
{ 
    std::cout <<"error while reading from standard input stream"; 
} 
0

당신은의 만 (공백으로 구분) 첫 번째 단어

1

으로 읽습니다 >> cin.getline(), CIN을 사용할 필요가 참고 문헌 및 복사에 대한 질문에 대해 :

string& reverseInput(string& input) 
{ 
    for (i = 0, j = input.length()-1; i < j; i++, j--) 
    { 
     char c = input[i]; 
     input[i] = input[j]; 
     input[j] = c; 
    } 
    return input; 
} 

당신은 참조로 인수를 전달, 당신은 참조를 반환합니다. 복제가 필요 없으며 본문에서 새 문자열을 정의하지 않고 동일한 인스턴스에서 작업하고 있습니다.