2014-12-21 4 views
2

메신저 + 연산자를 사용하지 않고 두 개의 문자열을 함께 사용하려고 시도합니다. 문제는 두 번째 문자열을 읽을 수 없으면 첫 번째 문자열 만 표시됩니다. 여기 내 코드는 입니다.이 코드는 두 문자열을 하나로 복사하는 것과 같습니다.두 개의 문자열을 연결하는 C++

char str1[MAX]; 
char str2[MAX]; 

cout<<"Enter The first String:\n"; 
cin.getline(str1,MAX,'\n'); 
cout<<"Enter the second String:\n"; 
cin.getline(str2,MAX,'\n'); 

char str3[2*MAX]; int k=0; 

for(int i=0;i<MAX;i++) 
{ str3[k]=str1[i]; k++; } 
for(int j=0;j<MAX;j++) 
{ str3[k]=str2[j]; k++; } 

str3[k]='\0'; 
cout<<endl<<"Here is the concatenated string:\n"; 
cout<<str3<<endl; 
+0

C 문자열을 사용하고 있습니다. C++ String 클래스 사용을 고려해 보셨습니까 – Will

+0

@ 지금 완료되었습니다 ... –

+0

C++ 방식으로 처리되지 않았습니다. – Will

답변

4

포인터를 사용하여 코드를 작성하는 것이 좋습니다.

그래서 나는 또한 다음

char str3[2 * MAX]; 

char *p = str3; 

char *q = str1; 

while (*p = *q++) ++p; 

q = str2; 

while (*p++ = *q++); 

루프를 사용하여 작성 될 수 같은이 잘못된 코드

char str3[2*MAX]; int k=0; 

for(int i=0;i<MAX;i++) 
{ str3[k]=str1[i]; k++; } 
for(int j=0;j<MAX;j++) 
{ str3[k]=str2[j]; k++; } 

str3[k]='\0'; 

을 대체 할 것입니다. 예 :

char str3[2 * MAX]; 

char *p = str3; 

for (char *q = str1; *p = *q++; ++p); 
for (char *q = str2; *p++ = *q++;); 
+0

나는이 부분을 아직 지나쳤다. –

+0

@ali gholami 그래서 오늘 뭔가 새로운 것을 알게되었습니다. :) –

2

코드는 자신의 널 터미네이터 포함 str1str2의 끝을지나갑니다. srt1의 널 종결자가 복사되면 str3 안에있는 C 문자열은 완료된 것으로 간주되므로 str2 부분은 무시됩니다.

'\0'str1에있는 것을 확인하고 그 시점부터 str2을 복사하면 중지되도록 첫 번째 루프를 수정해야합니다. 두 번째 루프도 동일하게 수행하십시오. 코드는 이미 널 (null) 종료를 추가, 그래서 결과는 정확합니다

for(int i=0;i<MAX && str1[i] != '\0';i++) 
{ str3[k]=str1[i]; k++; } 
for(int j=0;j<MAX && str2[j] != '\0';j++) 
{ str3[k]=str2[j]; k++; } 

참고 : 나는 이것이 당신이 std::string를 사용할 수 없습니다하는 학습 운동이라고 가정하고있다.

+0

Dang, 너무 빠름;) http://www.cplusplus.com/reference/istream/istream/getline/에 대한 참조를 추가하면 str1, str2에 널 종료가 발생하는 이유를 설명합니다. – Centril

+0

감사합니다 .... awesome –

+0

AFAIK, 문서에서는'char *'의 마지막 요소가 항상 'null로 끝났습니다'라고 명시하여 for (int i = 0; i Centril

2

올바른 코드가 있어야한다 : - 당신은 계정 null 종결을 고려 따라서 그 과거 읽는되지 않은

char str3[2*MAX]; 
int k=0; 

for(int i = 0; str[i] != '\0'; i++) 
{ 
    str3[k]=str1[i]; 
    k++;  
} 
for(int j=0 ; str2[j] != '\0'; j++) 
{ 
    str3[k] = str2[j]; 
    k++; 
} 
str3[k]='\0'; 

.

0

변경이 :

for(int i=0; str1[i] ;i++) 
{ str3[k]=str1[i]; k++; } 
for(int j=0; str2[j] ;j++) 
{ str3[k]=str2[j]; k++; } 

당신은 합치 중지해야 할 때 str1[i] 또는 str2[j]
0 ('\0')을 할 때입니다 str1 또는 str2 끝. 하지만 MAX을 반복했습니다. 그래서 프로그램에서 잘못된 결과가 나왔습니다.
희망 하시겠습니까?

0

@ dasblinkenlight는 왜 그녀/대답에서 작동하지 않는지 설명합니다.

표준 C (++) 라이브러리 함수 strcat을 사용하는 또 다른 솔루션이 있습니다. http://www.cplusplus.com/reference/cstring/strcat/

#include <iostream> 
#include <cstring> 
using namespace std; 

int main(int argc, char** argv) { 
    char str1[MAX]; 
    char str2[MAX]; 

    cout << "Enter The first String:" << endl; 
    cin.getline(str1, MAX); 
    cout << "Enter the second String:" << endl; 
    cin.getline(str2, MAX); 

    char str3[2 * MAX]; 
    strcat(str3, str1); 
    strcat(str3, str2); 

    cout << endl << "Here is the concatenated string:" << endl 
      << str3 << endl; 
} 
관련 문제