2014-12-09 6 views
1

strcpy의 작업은 한 문자열의 내용을 다른 문자열로 복사하는 것임을 알았습니다. 지금까지 나는 strcpy을 사용할 때 이전 내용이 완전히 삭제되고 새로운 내용이 복사된다는 것을 생각하고있었습니다. 다음 프로그램을 참고하십시오.기존 문자열에 새 문자열을 복사 한 후에도 일부 포함 된 오래된 항목도 사용할 수 있습니다

#include<iostream> 
#include<string.h> 
using namespace std; 
int main() 
{ 
    char str[]="abcdef"; 
    strcpy(str,"xyz"); 
    cout<<str[4]; 
    cout<<str; 
    return 0; 
} 

출력은 exyz입니다. 컴파일 된 코드는 online compiler을 참조하십시오.

첫 번째 문제는 새로운 문자열을 복사 할 때 이전 포함 된 내용을 삭제해야하지만 여기서는 발생하지 않는다는 것입니다.

그런 다음 새로운 문자열 길이가 기존 문자열보다 작기 때문에 포함 된 처음 3 개만 삭제되고 나머지는 남게된다는 결론을 내 렸습니다. 하지만 이라고 쓰면 cout<<str[3];이라고 쓰여졌을 때 아무 일도 없었습니다.

cout<<str[4];에 우리는 e을 받고 있지만, cout<<str[3];에 우리는 d을 받고 있지 않습니다.

+0

"xyz"는 끝에 0을 가지므로 d가 보이지 않지만 e를 보게됩니다. 또한 왜 std :: string을 사용해야하고 C-strings는 사용하지 않아야합니다. – Borgleader

답변

2

null이 종결 자로 덮어 쓰므로 str[3]은 0입니다. str[4]'e'을 포함합니다. strcpy()은 필요한만큼의 문자 만 수정하며, str의 길이가 얼마인지 모르기 때문에 나머지는 제로로 만들 수 없습니다.

정말로 배열을 제로화하려면 memset()을 사용하십시오.

+0

선생님,하지만 우리가'cout << str'을 할 때'abc'를 보여주고 있습니다. 당신이 말했듯이, 그것이 필요한만큼만 많은 성격을 수정한다면 그것은'abcef'를 보여 주어야합니다. 친절하게도'cout << str'에'abcef'를 표시하지 않고'cout << str [4]에'e'를 표시하는 이유를 이해하게하십시오. – Singh

+1

@Singh :'cout << str'은'str []'의 첫 번째'\ 0'보다 먼저 나오는 문자만을 보여줍니다. 당신은'str [3]'에'\ 0'을 넣습니다. – MSalters

+0

@MSalters 감사합니다. – Singh