2016-08-13 5 views
-4

저는 코딩 초보자이며 사용자가 입력 한 문자열의 순서를 반대로 바꾸는 프로젝트를 친구에게 제공했습니다. 그러나이 코드를 실행하면 반복적으로 많은 문자열이 인쇄됩니다 시간이 넘었고 뭐가 잘못 됐는지 모르겠다.문자열을 반대로하는 방법

예를 들어 "hi"을 입력하면 "hi"이 여러 번 인쇄됩니다. 당신은 인덱스 연산자를 사용해야

cout << arr << endl; 

: 나는

#include <iostream> 

using namespace std; 

int main() 
{ 
    char arr[5]; 
    getline(cin, arr); 
    for(int x=4; x>=0; x--){ 
     cout << arr << endl; 
    } 
    return 0; 
} 
+2

문자열을 역순으로 인쇄하고 실제로 문자열을 뒤집는 것은 다른 두 가지입니다. 실제로 문자열을 역순으로하지만 역순으로 인쇄하려고하면 제목에서 묻습니다. 당신은 실제로 무엇을 성취하려고합니까? – taskinoor

+0

루프를 제거하고'cout << arr << endl; '을 그대로두면 어떻게됩니까? 그리고 루프 안에 넣으면 왜 다른 것을 인쇄합니까? – molbdnilo

+0

관련없는 메모에서 첫 번째 프로그램 중 하나에 버그가 있고 본능적 인 사실은 반전 방법의 논리가 좋은 징조가 아닌 것을 제외한 모든 것을 검사하는 것이 었습니다. – molbdnilo

답변

0

이 줄은 잘못된 것입니다 ... (친구가 권장) cin, getlinescanf를 사용했지만, 아무 소용이있다 [] 다음과 같이하십시오 :

cout << arr[x]; 

새 줄의 모든 문자를 인쇄하므로 endl이 없습니다.

arr [x]를 사용하면 인덱스 x에 배열의 요소 (또는 사용자가 원하는 경우 문자열의 문자)를 얻을 수 있습니다. C++의 요소 인덱스는 0부터 시작합니다. 따라서 첫 번째 요소는 arr [0], 두 번째 arr [1] 등입니다.

왜 크기 5의 C 스타일 char 배열을 사용합니까? C++ std :: string을 효과적으로 사용할 수 있으며 더 큰 문자열에서도 사용할 수 있습니다.

희망이 있습니다.

0

쓸 때 cout << arr << endl;은 루프의 각 반복에서 전체 문자열을 인쇄합니다. 대신, 인덱스 x에 문자를 인쇄하려면 cout << arr[x];으로 작성해야합니다. endl을 루프 안에 사용하면 각 문자 다음에 새로운 행이 생깁니다.

또한 C++에는 문자열 라이브러리를 사용하여 문자열을 다루는 더 쉬운 방법이 있습니다. 그런 다음 문자열의 문자 수를 미리 지정할 필요가 없으며 사용자가 4 자 이상을 입력해야하는 경우 도움이됩니다. 무슨 일

#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 
    string arr; 
    getline(cin, arr); 
    for(int x=arr.size()-1; x>=0; x--){ 
     cout << arr[x]; 
    } 
    cout << endl; 
    return 0; 
} 
+0

그래서 문자열 라이브러리를 포함함으로써 코드는 개별 문자로 문자열을 읽습니까? 그리고 차례로 이것이 배열 인 것처럼 문자열을 처리 할 수 ​​있습니까? –

+0

@ClovisNyu 배열과 마찬가지로 문자열의 모든 인덱스를 참조 할 수 있으며 사용자가 입력 할 수있는 입력 시간을 걱정하지 않아도됩니다. – GoodDeeds

0

cout 5 번 arr의 전체 내용을 보내는 것입니다. 대신에 각 문자를 역순으로 인쇄하는 것이 좋습니다. 이 작업을 수행하기 위해, 당신은 당신의 for 루프 내에서 한 번에 arr의 한 문자를 보낼 필요가 : 또한

cout << arr[x] // This sends the character at index x to cout 
cout << arr // This sends the entire array to cout 

, 당신은for 루프 후 cout << endl을 가져야한다; 그렇지 않으면 각 문자 다음에 개행 문자를 인쇄합니다.

1

질문에 C++이라는 태그가 지정되어 있으므로 std::stringstd::reverse과 같은 C++ 구문을 사용해야합니다. 이렇게하면 더 읽고 이해할 수있는 코드가됩니다.

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

int main() 
{ 
    std::string input; 
    std::getline(std::cin, input); 
    std::reverse(input.begin(), input.end()); 
    std::cout << input << std::endl; 
    return 0; 
} 
0

대체 솔루션을 사용하여 반복자 : 당신의 도움에 대한

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

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

    for (std::string::reverse_iterator rit=input.rbegin(); rit!=input.rend(); ++rit) 
    std::cout << *rit; 

    return 0; 
} 
0

감사합니다. Bart와 Fang에 대한 응답으로 미안하지만 나는 당신이 말하는 것을 완전히 이해하지 못합니다. std ::는 무엇을 하는가? 그리고 반복자는 무엇입니까? 솔직히 나는 아직 훔치지 않았다. 그래서 나는 정말로 누군가 여기에서 먹이를 숟가락으로 먹기를 기대하지 않는다. GoodDeeds와 syntax_error로 다른 답변을 읽은 후 흥미로운 발견을했습니다.

지적 된 실수는 내가 코드를 사용하여 효과가 있는지 확인한 결과입니다. 나는 원래 arr [x]를 썼다. arr이 아니다. (endl thingy는 내 잘못이다.) 나에게 놀란 것은 GoodDeed의 코드를 스스로 붙이면 문제가 해결되지 않는다는 것입니다. 나는 소프트웨어를 의심하기 시작하여 전체 코드를 삭제하고 단순히 썼습니다. < < 안녕하세요; 놀랍게도, 그것은 여전히 ​​입력을 요구하고 그 입력을 여러 번 인쇄했습니다.

약간의 인터넷 검색을 한 후, 나는 "빌드"에 대해 알게되었습니다. 그것을 이해할 수는 없지만 코드를 변경하지 않으면 코드 블록이 변경 사항을 인식하지 못합니다.

도움 주셔서 감사합니다.

관련 문제