검색결과 리스트
글
배열 가운데 C에서 가장 많이 사용하는 배열은 문자 배열일것이다. 문자 배열을 사용하는 함수의 예를 들기 위해,여러 행을 읽어서 그중 가장 긴 행을 출력하는 프로그램을 작성해 보자
while(읽을 행이 있으면)
if(지금 읽는 행이 지금까지 가장 길었던 행보다 길면)
그 행과 행의 길이를 기억
가장 긴행을출력
전체 프로그램은 행을 읽어 들이는 부분,길이를 재는 부분,가장 긴 행을 저장하는 부분 그리고 전체를 관리하는 부분으로 나누어질수 있으므로 각 부분을 각각 하나의 함수로 만들도록 한다. 물론 전체를 관리하는 함수는 main이 될 것이다. 프로그램은 다음과같다
#include <stdio.h>
int power(int m,int n);
#define MAXLINE 1000 /* maximum input line size */
int my_getline(char line[ ],int maxline);
void copy(char to[],char from[]);
/* print longest input line */
int main(void)
{
int len; /* current line length */
int max; /* maxinum length seen so far */
char line[MAXLINE]; /* current input line */
char longest[MAXLINE]; /* longest line saved here */
max = 0;
while ((len = my_getline(line, MAXLINE)) > 0)
if (len > max) {
max = len;
copy(longest, line);
}
if (max > 0) /* there was a line */
printf("%s", longest);
return 0;
}
/* mygetline: read a line into s, return length */
int my_getline(char s[], int lim)
{
int c = 0, i;
for (i=0; i<lim-1 && (c=getchar()) !=EOF && c != '\n'; ++i)
s[i] = c;
if (c == '\n') {
s[i] = c;
++i;
}
s[i] = '\0'; //파일의 끝
return i; //리턴
}
/* copy: copy 'from'into 'to; assume to is big enough */
void copy(char to[], char from[])
{
int i;
i = 0;
while ((to[i] = from[i]) != '\0')
++i;
}
원서에는 my_getline이 아니라 getline 함수인데 posix 이후로 stdio.h에 이미 getline 함수가 생겼기때문에 getline 이라고 쓰면 에러가 난다 그래서 함수이름을 바꾸어 주었다
한행을 읽어들이는데는 getline함수는 표준 입출력에 있는 getchar 함수를 이용한다 getline 함수는 행의 길이를 알아내고 파일의 끝을 만나면 0의 값을 내준다. 이전에 가장 길었던 행보다 더 긴행을 찾으면 저장해야 한다 그 저장을 맡은 함수가 copy이며 전체의 흐름관리는 main이 한다
getline함수의 첫번째 매개변수는 배열로 되어있고 두번째 매개변수는 정수형으로 되어있다 여기서 배열 s 의 길이가 정해지지 않는 이유는 그길이가 main에서 결정되기 때문이다 그리고 copy 함수 에서는 main으로 리턴하는 값이 없다(copy는 void로 선언 되었기 때문에)
getline함수는 한 행을 읽어 문자 배열로 만드는 동작을 하는데 배열끝에 '\0'(null)을 넣어 준다
예를들어 hello\n는 다음과 같이 된다
h e l l o \n \0
이와 같이 만들어진 문자 배열을 printf 함수를 사용해서 출력할 셩우 출력양신은 %s로 지정해 주게 된다 그리고 copy 함수가 행을 기록할때 '\0' 끝에 붙어있는 형태로 기록하게 되어있다 이프로그램에서 한가지 생각 해볼게 있는데 읽어들일수 있는 값보다 더 긴행을 만나면 어떻게 될까? getline 함수를 보면 한계 값보다 긴 행이 읽히면 한계까지만 읽고 나머지는 읽지 않게 되어있다. 이떄 문자 배열의 끝 문자는 '\0'이 아니다(행의 중간까지만 읽었으므로) 그로므로 main은 getline 을 사용해서 읽어 들인 행의 마지막 문자를 읽어 그 행이 너무 긴행인지 아닌지를 판단할수 있다. copy 함수는 행의 길이를 알고 있으므로 이런 과정이 필요없다.
예제 1-16 위 프로그램의 main을 수정해서 모든 행의 길이와 문자를 출력하라.
예제 1-17 길이가 80자 이상인 모든행을 출력하는 프로그램을 작성하라.
예제 1-18 파일의 각 행에서 뒷부분의 공백과 tab을 제거하고 전체가 공백인 행을 삭제한느 프로그램을 작성하라.
예제 1-19 문자역 s의 문자 순서를 뒤집는 프로그램을 작성하라. 이함수에 reverse라고 이름 붙이고 이 함수를 사용해서 파일의 한 행씩 순서를 뒤집는 프로그램을 작성하라.
*** 조금은 어려운 개념들
'프로그래밍 > C' 카테고리의 다른 글
2.1 변수명(Variable Names) (0) | 2014.10.27 |
---|---|
1.10 외부변수(External Variables and Scope)- (0) | 2014.10.27 |
1.8 매개변수 값 전달(Argument - Call by Value) (0) | 2014.10.27 |
1.7 함수(Functions) (0) | 2014.10.27 |
1.6 배열(Arrays) (0) | 2014.10.27 |
RECENT COMMENT