생활
C언어 구조체에서 문자를 초기화할때 왜 strcmp를 써야하나요?
struct book{
char name[100];
int price;
};
struct book b1;
b1.name = "컴퓨터";
위와 같이 했을때 에러가 뜹니다. strcmp를 사용해서 코드를 작성하면 애러가 없습니다.
6개의 답변이 있어요!
일단 strcmp 는 C언어에서 문자열을 비교하는 함수입니다.
따라서 b1.name 에 "컴퓨터"라는 값을 입력하는 것과 같은 동작과는 차이가 있습니다.
문자열을 복사하는 strcpy를 착각하신 것이 아닌가 생각이 됩니다.C언어에는 문자열을 문자 타입의 연속된 값으로 사용을 하고 있습니다.
"컴퓨터"라는 코드상의 문자는 프로그램 실행하는 시점(런타임)에서 기억공간 상의 어떤 위치(포인터)를 나타냅니다.
따라서 char *name = "컴퓨터"; 와 같이 포인터로 받아야 합니다.
반면에 char name[100]; 의 경우 포인트가 아닌 문자들을 저장할 수 있는 공간입니다.
따라서 대상으로 부터 값을 1:1로 복사하는 과정이 필요한데 이것을 strcpy로 수행할 수가 있습니다.
strcmp가 아니라 strcpy인 것 같습니다.
b1.name은 배열이기 때문에 lvalue가 아니기 때문에 "컴퓨터"를 할당 할 수 없습니다.
구조체가 아닌
char name[100] = "컴퓨터"; 로 초기화 할 경우에는 가능하지만,
이후 변수를 선언한 후에 대입할 때는
name[0] = "컴"; (한글이기 때문에 정확히 이렇게 안들어갈 수 있습니다)
name[1] = "퓨";
name[2] = "터";
로 하나씩 대입하는 수밖에 없습니다. (strcpy가 이것을 해줍니다);
안녕하세요. 아마 strcpy를 의미하신거 같습니다.
name은 100개짜리 char array라는 자료형이고, "컴퓨터"는 string 이고 실제 값은 pointer가 대입이 되기 때문에
둘의 자료형이 같지 않아서 오류가 납니다.
main.c:24:9: error: assignment to expression with array type b1.name = "컴퓨터";따라서 strcpy를 쓰거나 char *name으로 바꾸시고, name에 memory를 allocation해야 합니다.
기존에 char name[100]을 그대로 사용하신다면 아래와 같이 code를 변경하시면 됩니다. 또한 strcpy를 쓰기위해서는
string.h를 include하셔야 합니다.
#include <stdio.h> #include <string.h> struct book{ char name[100]; int price; }; int main() { struct book b1; strcpy(b1.name, "컴퓨터"); }C 언어의 문자열은 Java같이 나중에 나온 언어와는 많이 다릅니다.
문자열을
b1.name = "컴퓨터";
과 같이 정의하면 "컴퓨터" 문자열 전체가 아닌 문자열의 주소 (정확하게는 "컴"이 저장된 메모리의 주소)가 assign됩니다.
하지만 질문자께서 원하신 건 name[0]에 "컴", map[1]에 "퓨"가 들어가는 거죠?
그러기 위해서는 "컴퓨터"가 저장된 메모리에서 b1.name이 할당된 메모리로 복사를 해야 합니다.
그 역활을 하는 함수가 strcpy입니다.
안녕하세요. C언어 구조체를 공부하고 계시네요.
C언어에서 문자열 삽입이 조금 어려울 수 있습니다.
strcmp 는 string compare의 준말로써 string 간의 비교할 때 사용합니다.
예를 들어 char str[100] = '특정한 문자열' 일때,
if(strcmp(str,'특정한 문자열')!= 0) 이런 형식으로 사용합니다.
단순히 같냐 다르냐의 비교할때이죠,
질문하신 내용을 파악해 보면 strcmp 가 아닌 strcpy 즉 string copy를 사용해서 문자열을 복사해서 넣어 주는것이 더 정확합니다.
안녕하세요.
구조체를 선언후에 초기화를 하는 방법이 잘못되었습니다.
*** 구조체 문자열 초기화
문자열 데이터는 구조체의 멤버에 대입시 strcpy(변수명, "문자열");이라는 문자열 복사 함수를 사용해야 합니다.
strcpy() 함수 사용을 위해서 헤더에 #include <string.h> 코드를 추가해줍니다.
예를 들어 strcpy( b1.name, "컴퓨터" ); //strcpy() 함수의 경우 "컴퓨터"만큼 메모리를 할당한후에 해당 메모리 위치를 배열에 할당합니다.