Backend/C 32

디스크 파일 사용하기 -여러 가지 함수들

1. 문자 입력 함수 getc(), fgetc() 지정된 스트림에서 한 문자를 읽어들인다. fgets() char *fgets(char *str, int n, FILE *fp) 파일에서 문장을 읽어들인다. 인수 str은 입력 내용이 저장되는 버퍼에 대한포인터, n은 입력되는 문자의 최대 개수, fp는 파일이 열릴 때 fopen()이 돌려주는 FILE형에 대한 포인터이다. 2. 문자 출력 함수 putc() 지정된 스트림에 한 문자를 출력한다. 원형은 에 정의되어 있고, 다음과 같다. int putc(int ch, FILE *fp) fputs() 지정된 스트림에 문장을 출력한다. 역시 stdio.h에 정의되어 있고 다음과 같은 원형이다. char fputs(char *str, FILE *fp) 인수 str은..

Backend/C 2012.04.12

링크드 리스트 다루기

준비하기 링크드 리스트를 사용하려면 링크드 리스트에서 사용할 데이터 구조체를 정의해야 하고 헤드 포인터를 선언할 필요가 있다. 링크드 리스트는 비어 있는 상태로 시작하므로 헤드 포인터는 NULL로 초기화 해준다. 또한 링크를 추가하는데 사용할 링크드 리스트의 구조체형에 대한 포인터를 추가로 선언해야 한다. 1 : struct person{ 2 : char name[20]; 3 : struct person *next; 4 : }; 5 : struct person *new; 6 : struct person *head; 7 : head = NULL; 링크드 리스트의 시작 부분에 링크 추가하기 1. malloc() 을 사용하여 메모리 공간을 할당하며 구조체형 변수를 생성한다. 2. 새로운 링크의 next 포인터..

Backend/C 2012.04.12

Segmentation Fault

다음 소스 코드를 보자. 이 코드에서 과연 에러가 날까? 1 : #include 2 : int main(){ 3 : int *p; 4 : 5 : *p = 1024; 6 : printf("%d\n", *p); 7 : return 0; 8 : } 이 코드는 중대한 문제점을 가지고 있다. p는 어떠한 번지를 저장할 수 있는 변수이다. 그래서 처음에는 어떠한 쓰레기 값이 번지로 들어가게 된다. (23984 라 가정하겠다.) 그런데 5번째 줄을 보면, 이 쓰레기 값이 주소인 곳 ( 23984 ) 에 1024를 넣으려 하고 있다. 이 코드는 실행했을 때에 아무런 에러가 없는 듯 보이지만, 만약 시스템에서 23984 라는 곳을 사용하고 있다면, "세그먼테이션 폴트"가 일어나게 되는 것이다. 이것은 다른 프로그램이 사..

Backend/C 2012.04.12

함수 인수로 사용되는 포인터

함수 인수로 사용되는 포인터 C의 매개변수 전달 방식은 "값에 의한 호출(call by value)"이다. 즉, 매개변수는 함수에 오직 한 방향으로 전달된다는 것이다. 함수의 유일한 결과는 하나의 반환값 뿐이다. 하지만, 포인터를 사용하면 함수의 결과를 반환값을 통하지 않고도 전달할 수 있다. C는 함수의 정보를 호출자로 넘길 수 있다. 아래의 소스 코드를 보자. 1 : #include 2 : void inc_count(int *count_ptr); //이 함수의 매개변수는 정수가 아니고 정수형 포인터이다. 3 : 4 : int main(){ 5 : int count = 0; 6 : while(count

Backend/C 2012.04.12

포인터(pointer)란 무엇인가?

포인터(pointer)란 무엇인가? C 프로그램에서 변수를 선언할 때 컴파일러는 변수를 저장하기 위해 유일하게 구분되는 주소의 메모리 영역을 할당한다. 컴파일러는 변수의 이름을 특정 주소에 연결시킨다. 주소 : 1000 1002 1003 1004 1005 - -- - - - - - 값 : 40 55 변수 : a b a와 b 라는 이름의 변수가 선언되고 각각 40, 55의 값으로 초기화 되었다. 그럼 포인터는 무엇일까? 예를 들어, int *p; 이라는 포인터형 변수를 선언해 보자. 이것은 int형의 어떤 변수를 가리킬 수 있는 포인터이다. 포인터 선언은 위와 같이 typename *ptrname; 의 형식으로 선언된다. 또한 포인터는 아래와 같이 일반적인 변수와 함께 선언될 수 있다. int *p , a..

Backend/C 2012.04.12

Call by value & call by reference

1 : #include 2 : void by_value(int a, int b, int c); //call by value : 값에 의한 호출 3 : void by_ref(int *a, int *b, int *c); //call by reference : 참조에 의한 호출 4 : void main() 5 : { 6 : int x =2, y = 4, z = 6; 7 : printf("\nBefore calling by_value(), x = %d, y = %d, z = %d.", x, y, z); 8 : by_value(x, y, z); //x, y, z는 지역변수 이기 때문에 main 내에서만 효과를 발휘합니다. 9 : printf("\nAfter calling by_value(), x = %d, y =..

Backend/C 2012.04.12

문자열의 길이를 계산하는 두 가지 방법

사용자 정의 함수를 만들어 주기 1 : #include 2 : 3 : int str_len(char *); 4 : void main(){ 5 : char buf[20]; 6 : puts("\nEnter a line of text: a blank line terminates."); 7 : gets(buf); 8 : int length = str_len(buf); 9 : printf("\nThat line is %u characters long.", length); 10 : } 11 : int str_len(char *p) //사용자 정의함수 12 : { 13 : int i = 0; 14 : while(p[i] != '\0'){ //문자열의 끝이 나올때까지 i 값을 증가시킨다. 15 : i++; 16 : }..

Backend/C 2012.04.12

argc, argv를 이용한 간단한 사칙연산.

1 : #include 2 : #include 3 : void main(int argc, char *argv[]){ 4 : int m = atoi(argv[1]); //argv[1]에 들어온 수를 m에 저장 5 : int n = atoi(argv[3]); //argv[3]에 들어온 수를 n에 저장 6 ; 7 : int j = *argv[2]; //argv[2]에는 부호가 들어감 8 : /*int j = argv[2][0]; 으로 해도 된다 */ 9 : int result; 10 : if(j == 43) //43은 '+'의 아스키 코드값 11 : result = m + n; 12 : else if(j == 45) 13 : result = m - n; 14 : else if(j == 47) 15 : resu..

Backend/C 2012.04.12
반응형