2014-12-19 3 views
0
/* Write a program that would mix-and-merge two given strings (s1 and s2) into string s3 as follows: 
first character of s1, first character of s2, second character of s1, second character of s2, etc. */ 

을 가지고하지만 내 코드에 문제가있는 경우 검사를 중지하는 방법 : 난 = S1 "John"에 대한 다음 "Stevens" 결과가 될 것입니다 S2에 대한 JSothenv e n s.문자열이 비어 인덱스

를 입력하면 어떻게 해결 할 것을 문자열 중 하나가 끝난 후에 남아있는 공백은 무엇입니까?

방법은 내가 그것을 고칠 것이라고 나는 if 루프에 대한 아래에 있습니다 확인하려면 인덱스가 null 또는 '\ 0'경우 볼 수있는 문자열로 임의의 값을 보유하고 작동하지 않습니다 문자열이 끝난 후

#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 
    string s1, s2; 
    string s3; 
    int i; // For index 
    int j = 0; // For second index and loop checking 

    cout << "Type first string: "; 
    getline(cin, s1); 
    cout << "Type second string: "; 
    getline(cin, s2); 

    s3.resize(s1.size() + s2.size() + 100); // The + 100 is used so we have space for all the characters. The + 100 is not needed if i fix my problem. 

    for(i = 0; j <= s1.size(); i += 2) 
    { 
     if(s1[j] == null) // With what do i check it? 
     { 
      break; 
     } 
     else 
     { 
      s3[i] = s1[j]; 
      ++j; 
     } 
    } 

    j = 0; 

    for(i = 1; j <= s2.size(); i += 2) 
    { 
     if(s2[j] == null) 
     { 
      break; 
     } 
     else 
     { 
     s3[i] = s2[j]; 
     } 
     ++j; 
    } 

    for(i = 0; i <= s3.size(); ++i) 
    { 
     cout << s3[i]; 
    } 

    return 0; 
+2

첫 번째 단락은 정말 혼란 스럽습니다. 다시 읽어보고 더 명확하게 생각하는 방법을 생각해보십시오. 예제 입력과 출력을 철저히 제공하면 도움이됩니다. –

+0

"두 개의 입력 문자열이 주어지면 입력 문자열의 문자를 인터리브하여 만든 세 번째 문자열을 생성하고 싶습니다. 예를 들어,"DOG "와"octopus "가 주어진다면, 나는 생산하고 싶을 것입니다. . " –

+0

그래, 고마워. 내가 지금 할게 :) 편집이 더 나아 졌어? – Johnson

답변

1

이 시도 :

#include <iostream> 
#include <string> 

using namespace std; 

int main(int argc, char const *argv[]) 
{ 
    string s1, s2, s3; 

    int i,j,k; 
    cout << "Type first string: "; 
    getline(cin, s1); 
    cout << "Type second string: "; 
    getline(cin, s2); 
    s3.resize(s1.size()+s2.size()); 

    for(i = 0, j = 0, k = 0; j < s1.size() && k < s2.size(); i++) { 
     if(i & 1) { 
      s3[i] = s2[k++]; 
     } else { 
      s3[i] = s1[j++]; 
     } 
    } 
    if(j == s1.size()) { 
     while(k < s2.size()) { 
      s3[i++] = s2[k++]; 
     } 
    } else { 
     while(j < s1.size()) { 
      s3[i++] = s1[j++]; 
     } 
    } 

    cout << s3 << endl; 

    return 0; 
} 
+0

이것은 내 친구를 작동하지만 어떻게 작동하는지 조금 설명 할 수 혼란 스러워요 – Johnson

+0

for 루프는 기본적으로 그들 중 하나가 끝날 때까지's1'과's2'를 인터리빙하고 있습니다. 그런 다음 if 문은 단순히 나머지 부분을's3'에 추가합니다. – justmscs

+0

이 부분을 약간 설명 할 수 있습니까? if (i & 1)' – Johnson

1

당신이 함께 getline 후 코드를 대체 할 수있다 : 그들은 '까지

string::const_iterator i1 = s1.begin(), i2 = s2.begin(); 
    bool useFirst = true; 

    while (i1 != s1.end() || i2 != s2.end()) 
    { 
    if (useFirst && i1 != s1.end()) 
    { 
     s3.push_back(*i1++); 
    } 
    else if (i2 != s2.end()) 
    { 
     s3.push_back(*i2++); 
    } 

    useFirst = !useFirst; // switch over for next iteration 
    } 

    cout << s3 << endl; 

그것은 교대로 두 개의 문자열을 통해 기본적으로 반복을 조금 간단하고, 다시 다 써 버렸다.

+0

고마워요. 지금은 작동하지만 조금 이상합니다. 결과 대신에'JSothenv e n s' 결과가 있습니다 : JSothenv e ns는 처음에는 많은 공백이있는 것처럼 보입니다. 편집 스택 오버플로는 표시하지 않지만 두 번째 결과에는 올바른 출력 인 JSothenv e ns가 표시되기 전에 구걸에 많은 공백이 있습니다. – Johnson

1

그것은 양쪽을 반복 한 번 범위 일반적인 interleave 알고리즘을 작성하는 것은 매우 간단합니다

template<typename InputIterator1, typename InputIterator2, typename OutputIterator> 
OutputIterator interleave(InputIterator1 first1, InputIterator1 end1, 
          InputIterator2 first2, InputIterator2 end2, 
          OutputIterator out) 
{ 
    while(first1 != end1 && first2 != end2) 
    { 
    out = *first1; 
    out = *first2; 
    ++first1; 
    ++first2; 
    } 
    // copy remaining elements from both ranges 
    while(first1 != end1) 
    { 
    out = *first1; 
    ++first1; 
    } 
    while(first2 != end2) 
    { 
    out = *first2; 
    ++first2; 
    } 
    return out; 
} 

Live demo here합니다. 사용법은 std::set_merge 같다 : 한 후, 사본을 모두 범위의 나머지 요소를 소진 할 때까지 모두 범위에 걸쳐 반복 할

interleave(begin(s1), end(s1), 
      begin(s2), end(s2), 
      std::back_inserter(result)); 

. 두 컨테이너를 한 번 반복하고 한쪽 범위가 다른 한쪽 범위보다 크지 않다고 가정하지 않고 한 번 두 번 종료 확인을 수행 할 수 없습니다. 이제 두 개의 다른 컨테이너를 처리 할 수 ​​있습니다

+0

'std :: begin'과'std :: end'를 평가하는 것은 나에게 반 패턴과 같은 느낌을줍니다. 자유 함수를 사용하여 begin/end가 원거리와 같은 ADL을 사용해야한다고 말하고 싶습니다. 또한 while 루프는 일관되게 작성합니다 (루프는 모두 구조적으로 동일합니다). 마지막으로 혼합 입력 범위를 허용하려고합니다. – sehe

+0

@sehe 완료. 그렇게 생각하지 마십시오 (ADL). 팁 고마워. – rubenvb

+0

내 제안 된 버전은 http://coliru.stacked-crooked.com/a/ce939199348423ee입니다. (잠재적으로 더 많은 비교를 수행 할 수도 있지만, 컴파일러가 최적화 후/프로파일 링 후 최적화에 대해 걱정할 필요가 있다고 말하고 싶습니다.) 출력 iterator (convention)를 리턴하는 방법을 보자. 그리고 다른 iterator 타입을 취할 수있다. – sehe

관련 문제