구조체가 문자 그룹으로 바뀌다

2013 단어 linux 프로그래밍
어젯밤에 socket을 통해 구조체를 보내는 문제를 해결할 때 구조체를 문자열로 먼저 전환해서 보낼 수 있다는 것을 알았지만 오늘까지 해결되지 않은 의문이 있었습니다(설명하기 편리하도록 socket 부분을 제거하고). 먼저 코드를 보십시오.
#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);
명심해라!

좋은 웹페이지 즐겨찾기