나는 다음과 같이 조금 놀랐다.
예 1 :
char s[100] = "abcd"; // declare and initialize - WORKS
예 2 :
char s[100]; // declare
s = "hello"; // initalize - DOESN'T WORK ('lvalue required' error)
두 번째 접근 방식이 작동하지 않는 이유가 궁금합니다. 그것이 (다른 데이터 유형과 함께 작동 함) 당연한 것 같습니까? 누군가가 이것의 논리를 설명해 줄 수 있습니까?
답변
배열을 초기화 할 때 C를 사용하면 배열을 값으로 채울 수 있습니다. 그래서
char s[100] = "abcd";
기본적으로 다음과 같습니다.
int s[3] = { 1, 2, 3 };
그러나 s
자유 포인터가 아닌 배열 이기 때문에 할당을 할 수 없습니다. 그 의미
s = "abcd"
의 포인터 값 할당하는 것입니다 abcd
로를 s
하지만 당신은 변경할 수 없습니다 s
아무 것도 배열을 가리키는되지 않습니다 때문이다.
이것은 할 수 있고 경우에 작업을 수행 s
A는 char*
– 무엇을 가리킬 수 있습니다 포인터.
문자열을 복사하려면 간단히 strcpy
.
답변
C에서 “문자열”과 같은 것은 없습니다. C에서 문자열은 char
null 문자로 끝나는 의 1 차원 배열입니다 \0
. C에서는 배열을 할당 할 수 없기 때문에 문자열도 할당 할 수 없습니다. 문자 그대로 “hello”는const char x[] = {'h','e','l','l','o','\0'};
올바른 방법은 다음과 같습니다.
char s[100];
strncpy(s, "hello", 100);
또는 더 나은 방법 :
#define STRMAX 100
char s[STRMAX];
size_t len;
len = strncpy(s, "hello", STRMAX);
답변
초기화와 할당은 여기서 동일한 연산자 ( “=”)를 사용하는 두 가지 별개의 작업입니다.
답변
1 char s[100];
2 s = "hello";
제공 한 예제에서 s는 실제로 2 행이 아닌 1 행에서 초기화됩니다.이 시점에서 명시 적으로 값을 할당하지 않았더라도 컴파일러는 수행했습니다. 2 행에서 할당 작업을 수행하고 있으며 이와 같은 다른 문자 배열에 하나의 문자 배열을 할당 할 수 없습니다. 배열의 각 요소를 할당하려면 strcpy () 또는 일종의 루프를 사용해야합니다.
답변
Sparr의 답변 을 확장하려면
초기화와 할당은 여기서 동일한 연산자 ( “=”)를 사용하는 두 가지 별개의 작업입니다.
다음과 같이 생각하십시오.
InitializeObject
, 및 이라는 2 개의 함수가 있다고 가정 해보십시오 AssignObject
. 컴파일러가 볼 때 thing = value
컨텍스트를 보고 InitializeObject
새 thing
. 그렇지 않으면 대신 호출AssignObject
.
일반적으로이 같은 괜찮 InitializeObject
및AssignObject
일반적으로 동일한 방식으로 작동합니다. 문자 배열 (및 몇 가지 다른 경우)을 다룰 때를 제외하고는 다르게 동작합니다. 왜 이러나요? 글쎄 그것은 스택 대 힙 등과 관련된 완전히 다른 게시물입니다.
추신 : 제쳐두고, 이런 식으로 생각하면 복사 생성자와 다른 것들을 이해하는 데 도움이 될 것입니다.
답변
다음을 수행 할 수 있습니다.
s[0] = 'h';
s[1] = 'e';
s[2] = 'l';
s[3] = 'l';
s[4] = 'o';
s[5] = '\0';
답변
이미 답변을 받았지만 C / C ++ Facebook 그룹에서 매우 유사한 질문을 한 사람에게 답변을 공유하고 싶었습니다.
배열에는 할당 연산자 기능이 없습니다 *. 이것은 단순히 문자열 리터럴에 char 배열을 할당 할 수 없음을 의미합니다. 왜? 배열 자체에는 할당 연산자가 없기 때문입니다. (* 변경할 수없는 const 포인터입니다.)
배열은 단순히 연속적으로 할당 된 메모리의 영역이며 배열의 이름은 실제로 배열의 첫 번째 요소에 대한 포인터입니다. ( https://www.quora.com/Can-we-copy-an-array-using-an-assignment-operator 에서 인용 )
문자열 리터럴 ( "Hello world"
또는 등 "abcd"
)을 char 배열에 복사하려면 문자열 리터럴의 모든 char 요소를 배열에 수동으로 복사해야합니다.
char s[100];
이것은 길이가 100 인 빈 배열을 초기화합니다.
이제이 배열에 문자열 리터럴을 복사하려면 strcpy
strcpy(s, "abcd");
그러면 문자열 리터럴의 내용이 복사 "abcd"
되어s[100]
배열에 됩니다.
이것이 무엇을하는지에 대한 좋은 예가 있습니다.
int i = 0; //start at 0
do {
s[i] = ("Hello World")[i]; //assign s[i] to the string literal index i
} while(s[i++]); //continue the loop until the last char is null
strcpy
이 사용자 지정 문자열 리터럴 복사기 대신 분명히 사용해야 하지만 strcpy
기본적으로 작동 하는 방식을 설명하는 좋은 예입니다 .
도움이 되었기를 바랍니다!