비전공자의 C언어 공부기 제 2편


2편

C언어

구조체

  • 구조체는 현실세계의 짬짜면과 비슷하다.
  • 짬뽕도 먹고 싶고 짜장면도 먹고 싶지만 하나의 그릇에는 아무리 많이 담아도 한가지 종류밖에 담을 수가 없었다.
  • 지금까지 우리가 배운 자료형들도 그렇다.
  • 배열을 사용해서 아무리 데이터를 많이 담아도 자료형이 다른 데이터들은 담을 수가 없었다는 점을 기억해보자.

선언

struct father
{
	int age;
	char name[100];
	char job[20];
	char dream[20];
	char wish_list[100];
	// 꿈 많은 아빠
	
}
struct father f;
f.age = 55;
strcpy(f.name, "JBH");
strcpy(f.wish_list, "세계 일주하기")

구조체와 포인터

  • 구조체는 두가지 포인터를 사용해 주소값을 가르킬 수 있다.
  • void 포인터 void* ptr
  • 구조체 포인터 father* ptr

  • 구조체 멤버 name의 주소값 &f.name
  • 여기서 문제! 그렇담 구조체를 가르키는 포인터를 사용해서 구조체 요소 주소에 어떻게 접근할까?
  • 그렇다.. 나는 여기서 몰라서 많이 헤맸다.
  • (char*)f라고 하면 구조체가 알아서 name의 주소에 접근해 줄까 기대했는데 아닌 듯하다.
  • 간접멤버 연산자라는 어려운 이름으로 접근한다.
  • ->
struct* p = &f;
// 구조체의 name의 주소값에 접근
p->name;

파일

feof를 조심하자

feof로 루프를 컨트롤 하는 것은 나쁜 접근 방식이다. 하지만 잘 모르고 사용하는 경우가 많다.

When reading in a file, and processing it line by line, it’s logical to think of the code loop as “while not at the end of the file, read and process data”. This often ends up looking something like this:

feof는 eof indicator가 eof를 가리키고 있는지를 확인한다. 따라서 eof를 찾아주는 함수가 필요한데 그것이 stream의 역할이다. stream이 파일을 다 읽고 나서 그리고 한번 더 읽으려고 시도할 때 eof를 읽게된다. 따라서 루프에 feof를 넣게 되면 의도치 않게 한번 더 루프를 돌게 되거나 컴파일러에 따라 다른 예상치 못한 에러를 출력하게 된다.

i = 0;
  
while (!feof(fp))
{
  fgets(buf, sizeof(buf), fp);
  printf ("Line %4d: %s", i, buf);
  i++;
}






© 2017. by yunsu

Powered by dolphin