2015-01-30 3 views
0

명령 줄 인수를 역순으로 인쇄하는 함수를 만들고 있습니다.cout 문의 터미널 공간 인쇄를 피하는 방법

#include <iostream> 
using namespace std; 

int main(int argc, char *argv[]) { 

    if (argc==1){ 
     cout <<"\n"; 
    } 

    for (int str=argc; str-1; str--){ 
     cout <<argv[str-1]<<" "; 

    } 
     if(argc>1){ 
     cout<<"\n"; 
     } 
    return 0; 
} 

내 문제는 이렇게이다 : 코드는 알아,하지만 난 그냥 작동 뭔가가 필요, 조금 우아이다가 현재 프로그램 된 각 명령 줄 인수가 인쇄 된 후,이 공간을 출력합니다. 그러나 최종 커맨드 라인 인수가 인쇄 된 후 공간이 필요합니다. 이 일을 어떻게 성취 할 수 있습니까? for 문 다음에 if 문을 넣어야합니까?

기본 질문 인 경우 용서해주세요. 나는 수색하고 유사한 무엇이든을 찾아 낼 수 없었다. 저는 C++의 기초를 배우는 중입니다. 현재 사용하고있는 교과서에는 도움이되지 않으므로 도움이된다면 고맙겠습니다. 도움을 주셔서 미리 감사드립니다.

+0

예, 실제로 오타였습니다. 잡아 주셔서 감사합니다! 내가 지금 고칠거야. – hooliaquoolia

답변

2

for 루프 다음에 if 문을 넣어야합니까?

예. 그것은 가장 간단하고 명확한 방법이 될 것입니다. 내 첫번째 선택이 될 것입니다하지만

cout << argv[argc - 1]; 
for (int str = argc - 1; str > 1; str--) 
{ 
    cout << " " << argv[str - 1]; 
} 

: 아마도 같은 뭔가 :

for (int str=argc; str>1; str--){ 
    cout << argv[str-1]; 
    if (str != 2) 
     cout << " "; 
} 
+0

답변 해 주셔서 감사합니다. 가능한 경우, 내가 필요한 종류의 if 문을 파악하는 데 도움을 줄 수 있습니까? 나는 정말로 혼란 스럽다. str이나 argv에 관한 if 문을 만들겠습니까? – hooliaquoolia

+0

정말 고마워요! 이 코드를 시도하고 완벽하게 작동했습니다. 나는이 설명을 정말 고맙게 생각하며 앞으로 코딩 할 때 반드시 메모를 할 것입니다. – hooliaquoolia

2

아니, 당신은 반드시 if 문이 필요하지 않습니다.

와 같은 경우

for (int str = argc; str > 1; str--) 
{ 
    if(str > 2) cout << argv[str - 1] << " "; 
    else cout << argv[str - 1]; 
}  
+0

답변 해 주셔서 감사합니다. 나는 이것을 시도하고 성공했다!그러나 이제 명령 줄 인수를 입력하지 않을 때 "분할 오류 (코어 덤프)"오류가 발생합니다. 표시 할 메인 포스트를 편집하겠습니다! – hooliaquoolia

+0

이 고통의 대부분은'[argc - 1, 1]'에서 루핑하는 대신'[argc, 2]'를 반복하는 훌리오콜 쿨러 때문에 생깁니다. –

0

경우 다른 데 뭐가 잘못?

... 
for (int str=argc; str-1; str--){ 
    cout << argv[str-1]; 
    if (str>2) cout << " "; 
} 
... 
+0

맞아, 고마워 빌 – pa0los

1

당신은 건너 뛰 if statements (당신이 의도 그들에게 매우 특별한 뭔가를하지 않는 한).

루프 (세 번째 연산자와 함께) 자체는 명령 줄 인수를 제공하지 않을 때 대/소문자를 처리합니다. for 루프 str > 1의 두 번째 매개 변수는 명령 행 인수가 없으면 (argc가 1이되기 때문에) 거짓이됩니다. 여전히 경우 문을 함께하고 싶어 내가 코드를 작성 거라고 생각하면

int str; 
    if(argc==1)  //if argc equals 1 
     cout <<"\n"; 
    else    //this would also include the argc > 1 cases. 
    { 
     for (str=argc; str > 1; str--) 
      cout <<argv[str-1]<<" "; //print n-1 characters within the loop 
     cout<<argv[str-1]<<"\n"; //and last one outside the for loop 
    } 
1

처럼 그것을 실제로 할 수

int str; 
for (str=argc; str > 1; str--) 
    (str > 2)?cout<< argv[str-1]<<" " :cout<<argv[str-1]<<"\n"; 

: 그래서 당신은과 같은 일을 얻을 수 있습니다 다르게.

#include <iostream> 
#include <vector> 
#include "infix_iterator.h" 

int main(int argc, char **argv) { 
    std::vector<char *> args {argv+1, argv+argc}; 

    if (args.empty()) 
     return 1; 

    std::cout << "\n";   
    std::copy(args.rbegin(), args.rend(), 
       infix_ostream_iterator<char *>(std::cout, " ")); 
    std::cout << "\n";  
} 

이 내가이 같은 작업을 많이 훨씬 용이하게 a question on CodeReview에 게시 된 infix_ostream_iterator를 사용 : 나는이 가까이 뭔가를 사용하는 거라고 생각합니다.

+0

답해 주셔서 감사합니다! 저는 C++에 완전히 익숙하지 않았습니다. 약 2 주 전에 시작되었으므로, 대부분이 제게 익숙하지 않습니다. 그러나 보여 주신 것에 대해 감사 드리며, 제가 좀 더 진보 해 나갈 때 다시 돌아올 것입니다. – hooliaquoolia