C프로그래밍

C프로그래밍/오류해결

C언어 - scanf와 gets사용시 주의!(버퍼)

문자열을 입력받거나 혹은 데이터를 입력받을때 scanf()와 gets()를 주로 사용한다. gets()는 공백문자를 포함하는 한줄의 문자열을 읽는다. 그리고 엔터키, 즉 줄바꿈문자('\n')는 포함되지 않으며 자동으로 NULL문자('\0')를 추가한다. 그리고 buffer라는 저장소에 저장된다. 반면에 scanf()는 하나의 단어밖에 입력받지 못한다. 공백을 포함하지 못한다. 표준입출력함수 printf, scanf, putchar, getchar, puts, gets같은 것들은 '표준 입출력 함수'라고한다. 이런 표준 입출력 함수를 사용할 때는 buffer라는 것을 제공받게 된다. 그렇다면 buffer는 뭘까?buffer란 여분의 임시 메모리 공간이다. 우리가 scanf, gets함수를 써서 데이터를 입..

C프로그래밍/개인 공부

C언어 - 동적 메모리

동적 메모리란? 프로그램이 메모리를 할당하는 방식에는 2가지 방법이 있다. 우리가 처음부터 써왔던 방법은 '정적 메모리 할당(static memory allocation)'이다. '정적 메모리 할당'은 미리 정해놓은 만큼의 메모리를 할당받는 것이다. 이 방법은 간편하지만 단점이있다. 공간의 낭비가 있을 수 있기 때문이다. 예를 들어서, 학생들 성적을 저장하기위해서 미리 100개의 정수를 저장할 수 있는 배열을 만들었다고 가정해보자. int scores[100] 하지만, 이 배열에 70명의 학생의 성적만이 입력된다면, 나머지 30개의 공간은 낭비되게 된다. 그렇다면 필요한 공간만 그때그때 할당받으면 메모리를 더욱 효율적으로 사용할 수 있게된다. 이것이 '동적 메모리 할당(dynamic memory allo..

C프로그래밍/개인 공부

C언어 - 열거형(enumeration)

열거형(enumeration)이란 변수가 가질 수 있는 값들을 나열해 놓은 자료형이다. 즉, 변수가 가질수 있는 상수값들을 나열해 놓은 자료형. 열거형으로 선언된 변수는 나열된 변수만 가질 수 있다. 예를 들어서, 요일을 나타내는 변수를 d라고 했을때, d는 월, 화, 수, 목, 금, 토, 일 만을 변수로 가질 수 있다. 그렇다면 열거형은 왜 쓰는가? 방금 전의 예처럼 월요일은 0, 화요일은 1, 수요일은 2 이런식으로 나타낼 수 있지만, 이렇게 하게 된다면 오류의 가능성, 가독성이 좋지않은 문제가 있다. 그렇기 때문에 MON, TUE, WED처럼 기호상수로 정의하는게 바람직하다고 볼 수 있다. 그렇다면 열거형을 한번 정의해보자. 예를 들어 요일을 나타내는 열거형을 정의해보면, 1 2 3 4 5 6 7 ..

C프로그래밍/개인 공부

C언어 - 구조체와 함수

구조체와 함수 구조체는 함수의 인수로도 사용이 가능하고 반환값으로도 사용가능하다. 구조체를 함수의 인수로 넘길때는 "값에 의한 호출"을 사용하게 된다. "값에 의한 호출" 즉, 복사를 사용하는 방법을 예제를 통해 알아보자. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 #include struct student { int num; char *name; float grade; }; int equal(struct student s1, struct student s2) { if(s1.num == s2.num){ return 1; } else{ return 0; } } int main(void) {..

C프로그래밍/개인 공부

C언어 - 구조체안에 문자배열? or 문자형을 가르키는 포인터?

1 2 3 struct{ char name[20]; }; cs 이렇게 하면 구조체 내부의 문자배열 name[20]에 문자열이 저장된다. 즉, 20바이트의 저장공간이 구조체 내부에 할당된다. 1 2 3 struct{ char *name; }; cs 이렇게 문자형을 가르키는 포인터를 선언하면, 문자열은 문자열 상수들이 모여있는 공간에 저장된다. 구조체 내부에는 포인터 name을 위한 1바이트만 할당되게 된다. 즉, 문자열을 위한 공간이 구조체 내부에는 없다. 문자열을 저장할 수 없다. 어딘가에 문자열이 이미 저장되어있을 경우에만 가르키면서 사용할 수 있다. 1 2 3 4 5 struct student{ char *name; }; struct student s; scanf("%s", s.name); cs 따라..

C프로그래밍/개인 공부

C언어 - 구조체와 포인터

구조체를 가르키는 포인터 지금까지는 포인터로 변수만을 가르켰다. 포인터는 구조체도 가르킬 수 있다. 구조체 포인터는 다음과 같이 만든다. 1 2 3 4 struct student s = {"2291048", "jin", "4.3"}; struct student *p; p = &s; Colored by Color Scripter cs 구조체 변수 s를 생성하고, student구조체를 가르킬 포인터 p를 만든다. 그리고 포인터 p에 구조체 변수 s의 주소를 넣어준다. 그리고 포인터 p가 가르키는 구조체의 멤버로 접근하려면 1 (*p).number cs 이렇게 '포인터가 가르키는 것'의 멤버 number 혹은 1 p->number cs 간단하게 이렇게 표현해도 된다. 그러면 멤버로 접근하는 간단한 예제를 보자..

Jminu
'C프로그래밍' 카테고리의 글 목록 (2 Page)