구조체가 문자 그룹으로 바뀌다
2013 단어 linux 프로그래밍
#include
#include
#include
typedef struct info
{
char name[5];
char num[10];
}INFO;
int main()
{
INFO info;
char buf[15];
strcpy(info.name, "won");
strcpy(info.num, "12345");
memcpy(buf, &info, sizeof(info));
printf("%s
", buf);
printf("%d
", (int)strlen(buf));
exit(0);
}
컴파일링이 실행된 후 첫 번째 변수의 값인'won'만 인쇄되었고'12345'는 인쇄되지 않았습니다.그리고 buf의 길이는 8이 아니라 3입니다.왜 그런 걸까요?설마 구조체가 문자열로 바뀌었을 때 완전히 바뀌지 않았단 말인가?
오늘 아침에 갑자기 printf () 함수와strlen () 은 모두 끝 문자를 만나면 되돌아오는 것이 생각났다!!!사실 buf 수조의 내용은 "won\012345\0"입니다.그래서'원'만 출력할 수 있습니다.
이 아이디어를 확인하기 위해 인쇄 문장을 다음과 같이 바꿀 수 있다.
int i = 0;
while(i < 15)
{
printf("%c", buf[i]);
i++;
}
printf("
");
컴파일링이 실행된 후 'won12345' 를 인쇄합니다.
더 좋은 방법은 문자열을 대응하는 구조체로 바꾸는 것이다. (이것이야말로 최종 목적이야) 다음은 코드이다.
#include
#include
#include
typedef struct info
{
char name[5];
char num[10];
}INFO;
int main()
{
INFO info, info1;
char buf[15];
strcpy(info.name, "won");
strcpy(info.num, "12345");
memcpy(buf, &info, sizeof(info));
memcpy(&info1, buf, sizeof(buf));
printf("%s,%s
", info1.name, info1.num);
exit(0);
}
memcpy(&info1,buf,sizeof(info)를 통해);문자 그룹 buf의 내용을 구조체 info1로 변환하여 컴파일한 결과'won, 12345'입니다.
성공!
---------------------------------------------------------------------------------------------------------------------------------------------------------------
방금 또 같은 실수를 했어!strlen은 socket의 전송 함수에 사용됩니다.
send(socket, buf, strlen(buf), 0);
구조체의 첫 번째 변수만 발송되었습니다!올바른 방법은 다음과 같습니다.
send(socket, buf, sizeof(buf), 0);
명심해라!