2010-11-23 2 views
3

예 : 개 C++에서 주어진 문장 (문자열)을 뒤집는 방법은 무엇입니까?

LIKE 입력이 있다면 개처럼 CATS 출력 - CATS 내가에만 사용해야하는 것을 고려 : IF-다른 조건, 루프, 배열, 문자열 및 기능에 대한 & 동안. NOT 문자열 함수, 포인터 & 동적 메모리 할당 & 구조체. 공백은 예제와 동일해야합니다.

나는 다음과 같이하려고 노력했다. 그러나 그것은 나에게 도움이 될만한 작품이 아닌가?

void revSent(char str[]){ 
char temp[100]; 
int k; 
for (i=sentenceSize ; i>0 ; i--) 
    for (k=0 ; k<sentenceSize ; k++) 
     temp[k]=str[i]; 

for (k=0 ; k<sentenceSize ; k++) 
    if (temp[k]!=' ') 
     for (i=k ; i>0 ; i--) 
      printf("%c", temp[i]); 

} 
+3

(findsubstr, 두 개의 매우 유용한 문자열 함수를 사용하여)입니다 :

내 방법은 무엇입니까? –

+3

+1 숙제를 추가하고 거짓말하려고하지 마십시오.] – superfro

+0

힌트 : http://www.cplusplus.com/reference/string/string/find/ – SingleNegationElimination

답변

5

당신은 해결책에 도달하기 위해 다음과 같은 구현할 수 :

  1. 별도의 문장을 단어 목록에.
  2. 이 목록을 역으로 지정하십시오.
  3. 이 목록을 결합하여 문장을 구성하십시오.
3

당신은 같은 단어를 정의하는 경우 공백으로 구분 한 후 다음 할 것 토큰 :

std::vector<std::string> sentence; 
std::copy(std::istream_iterator<std::string>(std::cin), 
      std::istream_iterator<std::string>(), 
      std::back_inserter(sentence)); 
std::reverse(sentence.begin(), sentence.end()); 

을 본질적으로 당신이 단어의 정의를 시작하려면, 다음 단어 컨테이너에 배치 마지막으로 std::reverse()을 사용하여 되돌립니다.

알고리즘 숙제의 경우 강사가 아마도이 문제에 만족하지 않을 것입니다. 문장을 단어로 분할하는 함수를 만들고 싶습니다. 물론 동일한 문자열 내의 포인터를 사용하여 작업 할 수 있습니다. 물론 강사의 의도 일 수도 있지만, 그렇지 않으면 개인적으로 컨테이너 작업을 더 쉽게 할 수 있습니다.

+0

나는이 해결책을 좋아한다. –

+0

두 가지. 1. 이것은 숙제이므로주는 것이 낫습니다. 2. 그는 데이터 구조를 사용할 수 없으므로 벡터는 허용되지 않습니다. – Paul

+0

좋은 반응입니다. 나는 그/그녀가 문자열이 아닌 입력으로 문자열을 가지고 있다고 생각합니다. 숙제 대답을 멀리하기위한 –

0
    은/어떤 파일/쓰기를 목록에 추가하려면 단어
  • 로 문장을 브레이크 스택
  • 에 각 단어를 밀어 스택에서 각 항목을 팝 아웃/인쇄
  • .

Voila!

+1

명백한 것을 제외하면 멋진 해결책입니다 그는 데이터 구조를 사용할 수 없다고 말합니다. – Paul

+0

+1 Paul. 나는 그 질문을 완전히 읽지 않은 것에 대해 어리 석다. 나는 다른 사람들이 그 일을 할 때 그것을 싫어하기 때문에 그것을하기 위해 열심히 일해야한다. 젠체하는 사람을 가리켜 주셔서 감사합니다. (편집 : 쓰레기, 나는 내 자신의 게시물을 downvote 수 없습니다) –

2

데이터 구조를 사용할 수 없으므로 Paul 또는 OJ의 방법을 직접 사용할 수 없으므로 힌트를 제공합니다. 그러나 재귀 함수 호출은 스택을 형성합니다.

9

그것은 추가 데이터 구조없이, 자리에서 이렇게 쉽게 :

  1. 가 전체 문자열 역

    : - DOGS LIKE CATS>STAC EKIL SGOD

  2. 은 문자열의 각 단어 역 : STAC EKIL SGOD를 ->CATS LIKE DOGS

힌트 : (1)과 (2) 모두 동일한 기능을 사용할 수 있습니다.

+1

이것은 방금 프로그래밍 진주에서 고전적인 솔루션입니다. – Blastfurnace

+0

@Blastfurnace : Cool - 프로그래밍 진주 (훌륭한 책)에 있었는지 몰랐지만 잘 알려진 해결책입니다. –

+0

이봐 요 이봐 요 이봐 요, 무슨 말했는지는 잘 안되나요? void revSent (char str []) { \t char temp [100]; \t int k; 위한 \t (I = sentenceSize; I> 0; 난 ...)에 대한 \t \t (K = 0; K 0; 난 -) \t \t \t \t printf ("% c", temp [i]); \t \t \t – Ben

0

누가 STL이 유용하지 않다고 말합니까?

어떻게하는지에 따라 공격 방법이 다양합니다. 여기

while (original_string isn't empty){  
    take first word 
    prepend to reversed string 
} 

는 C++ 솔루션은 지금까지이 일을

using namespace std; 
string word_reverse(string original){ 
    string reverse_string; 
    if (original.find(' ')!=string::npos){ 
     do{ 
      int pos=original.find(' '); 
      //prepend word 
      reverse_string=original.substr(0,pos)+' '+reverse_string; 
      //remove word from original,considering the found whitespace 
      original=original.substr(pos+1,original.length()-(pos+1)); 
     }while(original.find(' ')!=string::npos); 
     //don't forget the last word! 
     return original+' '+reverse_string; 
    } 
    else{//no whitespace: return original text 
     return original; 
    } 
} 
+0

문자열 함수를 사용할 수 없습니다 ... 어쨌든 고마워요 – Ben

+0

s'right. 적어도 지금 나는 이것을 쓸 수 있음을 안다. – rtpg

관련 문제