C - strcpy()가 필요한 이유
다음 코드 스니펫과 같이 문자열을 문자 배열에 할당하기 위해 strcpy()가 필요한 이유를 누가 설명해 줄 수 있습니까?
int main(void) {
char s[4];
s = "abc"; //Fails
strcpy(s, "abc"); //Succeeds
return 0;
}
의 이유는 무엇입니까?s = "abc"
실패? 그리고 strcpy()가 선언된 후 문자열을 char 배열에 할당하는 유일한 방법은 무엇입니까?기본적인 과제를 수행하기 위해 기능을 사용해야 한다는 것이 저에게는 이상하게 보입니다.
C의 배열은 할당할 수 없으며 복사 초기화할 수 없습니다.이것이 바로 C에서 어레이가 존재하는 방식입니다.역사적으로 (할당의 RHS에서) 값 컨텍스트에서 배열은 포인터로 감쇠하며, 이는 공식적으로 할당 및 복사 초기화를 방지하는 것입니다.이는 모든 어레이에 적용되며,char
배열
C 언어는 이전 언어인 B 및 BCPL 언어에서 이러한 배열 동작을 상속합니다.이러한 언어에서 배열은 물리적 포인터로 표시됩니다. (그리고 분명히 포인터를 다시 할당하는 것은 한 배열을 다른 배열에 할당할 때 발생하는 것이 아닙니다.)C 언어 배열은 포인터가 아니지만 대부분의 경우 포인터로 쇠퇴하여 B 및 BCPL 배열의 과거 동작을 "시뮬레이션"합니다.이러한 역사적 유산이 오늘날까지 C 어레이를 복사할 수 없게 만드는 원인입니다.
위의 예외 중 하나는 문자열 리터럴을 사용한 초기화입니다.할 수 있습니다
char c[] = "abc";
개념적으로 문자열 리터럴을 복사하는 경우."abc"
정렬하기 위해c
또 다른 예외는 배열이 전체 구조체 개체를 복사할 때 복사되는 구조체 유형으로 래핑되는 것입니다.이게 끝입니다.
않은) 마다, 은 네, 랩드복면려다배즉음같과하합다수와 같은 라이브러리 기능을 합니다.memcpy
.strcpy
끈으로 작업하는 데 특화된 맛일 뿐입니다.
이것이 바로 C에 있는 어레이입니다.할당할 수 없습니다.원하는 경우 포인터를 사용할 수 있습니다.
char *p;
p = "abc";
배열은 C에서 "2등 시민"입니다. 이러한 편견의 한 가지 요약은 당신이 그들에게 할당할 수 없다는 것입니다.
짧은 대답: 역사적 이유.C에는 기본 제공 문자열 유형이 없습니다.C++이 출시된 후에야 std::string이 생겨났고, 그마저도 최초의 구현과 함께 도착하지 않았습니다.
긴 답변: "abc"의 유형은 다음과 같습니다.char[]
오히려char *
.strcpy
는 포인터가 가리키는 데이터를 복사할 수 있는 메커니즘 중 하나입니다(이 경우 ABC).
strcpy
배열을 초기화하는 유일한 방법은 아니지만 문자열 끝에 있는 종료 0을 감지하고 존중할 수 있을 정도로 충분히 현명합니다.사용할 수도 있습니다.memcpy
문자열을 복사하여 에 넣다s
그러나 복사할 데이터의 길이를 전달하고 종료 0(NULL)이 다음에 있는지 확인해야 합니다.s
C 언어에는 문자열 리터럴에 대한 포인터와 길이 표시를 가져오기 위한 편리한 구문이 없습니다.많은 파스칼 방언을 포함한 일부 언어는 각 문자열 앞에 바이트 길이를 보고하는 접두사를 붙입니다. 이것은 여러 목적에 적합하지만 문자열 리터럴을 255자로 제한합니다.C의 접근 방식은 모든 길이의 문자열 리터럴을 수용할 수 있지만, 길이에 관계없이 오버헤드를 1바이트만 추가합니다.
제로 종단 문자열은 문자열 리터럴을 제외한 거의 모든 목적에서 다른 형태에 비해 열등하지만 리터럴은 많은 프로그램이 다루어야 할 가장 일반적인 형태의 문자열이며,따라서 라이브러리 함수가 효과적으로 처리하도록 하는 데 상당한 이점이 있습니다. 그러면 다른 유형에 대한 별도의 라이브러리 루틴 집합을 갖는 것보다 이상적이지 않은 경우 제로 종단 문자열을 사용하는 것이 더 쉬워집니다.
언급URL : https://stackoverflow.com/questions/6901090/c-why-is-strcpy-necessary
'programing' 카테고리의 다른 글
웹 API 응용 프로그램에서 PDF를 반환하는 방법 (0) | 2023.08.26 |
---|---|
간단한 "에이전트에서 이진 선택" 쿼리에 구문 오류가 발생하는 방법은 무엇입니까? (0) | 2023.08.26 |
저장 프로시저를 올바르게 마이그레이션하는 방법 (0) | 2023.08.26 |
Windows 서비스를 설치하거나 사용하지 않고 독립 실행형 php 데스크톱 응용 프로그램에서 직접 실행되도록 휴대용 mariadb 서버를 구성하려면 어떻게 해야 합니까? (0) | 2023.08.26 |
com.vmdk.jdbc.exceptions.jdbc4.MySQL NonTransient 연결예외:연결이 닫힌 후에는 작업이 허용되지 않습니다. (0) | 2023.08.21 |