-
[Kernighan - C] #5 - 5전기전자공학/프로젝트 2017. 6. 29. 00:53
[예제 5 -1]
위의 프로그램에서 숫자 앞이 아닌 다른 곳에 있는 +와 -는 0으로 취급되었다. 입력으로 읽을 수 있도록 해보라.. -- 무슨 의미인지 모르겠음.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354include <stdio.h>#include <ctype.h>/* 문자를 숫자로 출력하는 함수 */int getch(void);void ungetch(int);int getint(int *pn) {int c, sign;int sawsign;while(isspace(c = getch())) /* skip white space */;if(!isdigit(c) && c != EOF && c != '+' && c!= '-') {ungetch(c); /* it's not number */return 0;}sign = (c == '-') ? -1 : 1;/* c after non-digit can get */sawsign = (c == '+' || c == '-');if(sawsign)c = getch();if(!isdigit(c)) {ungetch(c);if(sawsign) /* sign 이 연달아 있으면 그냥 하나만 전달? */ungetch((sign == -1) ? '-' : '+');return 0;}for(*pn = 0; isdigit(c); c = getch())*pn = 10 * *pn + (c - '0');*pn *= sign;if(c != EOF)ungetch(c);return c;}int main() {int *str;int x;int ret;str = &x;ret = getint(str);printf("ret: %d x: %d", ret, x);printf("\n");return 0;}cs [예제 5-2]
부동 소수점을 출력하고 getint와 같은 동작을 하는 함수 getfloat를 작성하라. 함수 값은 어떤 형의 값이 될까?
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879#include <stdio.h>#include <ctype.h>/* 문자를 숫자로 출력하는 함수 *//* getfloat() */int getch(void);void ungetch(int);int getfloat(double *pn) {int c, sign;int power= 1;while(isspace(c = getch())) /* skip white space */;if(!isdigit(c) && c != EOF && c != '+' && c!= '-') {ungetch(c); /* it's not number */return 0;}sign = (c == '-') ? -1 : 1;if(c == '-' || c == '+')c = getch();if(!isdigit(c)) {ungetch(c);return 0;}for(*pn = 0; isdigit(c); c = getch())*pn = 10 * *pn + (c - '0');for( ;c == '.' || isdigit(c); c = getch()){ if( c== '.');else{*pn = 10 * *pn + (c - '0');power *= 10;}}*pn = *pn * sign / power;if(c != EOF)ungetch(c);return c;}int main() {double *str;double x;int ret;str = &x;ret = getfloat(str);printf("ret: %d x: %f", ret, x);printf("\n");return 0;}#define BUFSIZE 100char buf[BUFSIZE];int bufp = 0;int getch(void) {return (bufp > 0)? buf[--bufp] : getchar();}void ungetch(int c) {if(bufp >= BUFSIZE)printf("ungetch: too many character\n");elsebuf[bufp++] = c;}cs [예제 5- 3]
2장에 있는 함수인 strcat(s, t)<- 문자열 t를 s의 끝에 첨가하는 함수.
이 함수를 포인터를 사용한 함수로 바꾸어 보라.
1234567void strcat(char *s, char *t){while (*s++);s--;/* goes back to \0 char */while (*s++ = *t++);}cs \0부분으로 돌아가서 그 부분에서 t 문자열을 붙여야 한다.
그렇지 않으면 s를 출력할 때 \0부분에서 멈쳐 버린다.
main에서 활용하는 방법!
123456789101112131415161718192021222324252627282930313233343536#include <stdio.h>/* strcat: concatenate t to end of s; s must be big enough *//* 문자열 연결 함수 */void strcpy(char *s, char *t) {while(*s++ = *t++);}void strcat(char *s, char *t) {while(*s) /* find end of s */++s;strcpy(s, t);}int main() {char testbuff[128];char *test[] ={"apple","bear","choir","dear","ear"};strcpy(testbuff, test[0]);strcat(testbuff, " ");strcat(testbuff, test[1]);printf("%s\n", testbuff);return 0;}cs testbuff를 출력하면 "apple bear"가 나온다.
[예제 5-4]
문자열 t가 문자열 s의 끝에 있으면 1을, 그렇지 않으면 0을 리턴하는 함수 strend(s,t)를 작성하라.
12345678910111213141516171819202122232425262728293031323334#include <stdio.h>#include <stdlib.h>int strend(char*, char*);main() {int type;double op2;char s[MAXOP];int sign;char arr1[] = "hello ja my sunshine ja";char arr2[] = "sunshine";char arr3[] = "ja";char *ptr1 = arr1;char *ptr2 = arr2;char *ptr3 = arr3;printf("ptr1 and ptr2: %d\n",strend(ptr1, ptr2));printf("ptr1 and ptr3: %d\n", strend(ptr1, ptr3));}int strend(char *s, char *t){int num = strlen(s) - strlen(t);int state = 0; /* 문자열 끝에 있는지 없는지 확인*/while (num--)*s++;for (; *s == *t; s++, t++){if (*s == '\0')state = 1;}return state;}cs [예제 5 - 5]
라이브러리 함수인 strncpy, strncat과 strncmp 함수를 함수의 매개변수로 들어 오는 문자열의 처음 n문자에 동작하도록 바꾸어 보라.
예를 들어 strncpy(s,t)은 문자열 t의 최대 n문자를 s에 복사하도록 하낟. 부록 B에 프로그램의 설명이 있다.
① strncpy 함수
123456789101112131415161718192021222324252627282930#include <stdio.h>void mystrcpy(char *s, char *t, int n);main() {char arr1[] = " ";char arr2[] = "sunshine";char arr3[] = "ja";char *ptr1 = arr1;char *ptr2 = arr2;char *ptr3 = arr3;mystrcpy(ptr1, ptr2, 5);printf("%s\n", ptr1);mystrcpy(ptr1, ptr3, 5);printf("%s\n", ptr1);}void mystrcpy(char *s, char *t, int n){if (strlen(t) < n)while (*s++ = *t++);elsewhile (n--) {*s++ = *t++;*s = '\0';}}cs char *str = "hello"; 바로 선언 및 초기화해서 함수에 넣으면 bus error 10이 발생한다! 주의!!
1234567891011121314151617181920212223242526272829303132333435363738394041#include <stdio.h>int strlen(char *str) {int len = 0;while(*str++)len++;return len;}void strncpy(char *s, char *t, int n) {if(strlen(t) < n)while(*s++ = *t++);elsewhile(n--){*s++ = *t++;*s = '\0';}}int main() {/* char*에다가 바로 "hello"해서 함수에 넣으면 안됨.. */char arr1[] = " ";char arr2[] = "hello";char arr3[] = "ja";char *str1 = arr1;char *str2 = arr2;char *str3 = arr3;printf("%d\n", strlen(str2));strncpy(str1, str2,3);printf("str1, str2,3 -> str1: %s\n", str1);strncpy(str1, str3, 4);printf("str1, str3,4 -> str1: %s\n", str1);return 0;}cs ② strcat 함수
12345678void mystrcat(char *s, char *t, int n){while (*s++);s--;/* goes back to \0 char */while (n--)(*s++ = *t++);*s = '\0';}cs ③ strcmp 함수
12345678910111213141516171819202122232425262728int strcmp(char *s, char *t, int n) {while(*s == *t) {n--;if(*s == '\0')return 0;else if(n == 0)return 0;s++;t++;}return *s - *t;}int main() {/* char*에다가 바로 "hello"해서 함수에 넣으면 안됨.. */char arr1[] = " ";char arr2[] = "helmo";char arr3[] = "hella";char *str1 = arr1;char *str2 = arr2;char *str3 = arr3;printf("strcmp(helmo, hella, 3): %d\n", strcmp(str2, str3, 4));return 0;}cs [예제 5 - 6]
앞의 장에 나왔던 배열 사용 함수들을 포인터를 사용한 것으로 고쳐라. 고칠만한 것은 다음과 같다.
getline(1장, 4장) atoi, itoa와 변형된 함수들(2, 3, 4장), reverse(3장), strindex와 getop(4장)
getline.c
123456789101112131415161718192021222324252627#include <stdio.h>#define MAXOP 100main(){char arr1[] = "";char *ptr1 = arr1;printf("%d\n", getline(ptr1, MAXOP));}int getline(char *s, int lim) // 엔터키도 길이에 포함{int c;int len = lim;while (lim - 1 && (c = getchar()) != EOF) {*s = c;if (c == '\n')*s++ = c;lim--;}*s = '\0';if (!(lim - 1))return len - 1;elsereturn len - lim;}cs '전기전자공학 > 프로젝트' 카테고리의 다른 글
[ACES - C ] 데이터 형과 변수의 종류(지역변수, 전역변수, 정적변수) (0) 2017.07.11 #5-6,7 포인터 배열 (0) 2017.06.29 [Kernighan - C] #4-1,2 함수의 기초 (0) 2017.06.26 [Kernighan - C] #2-11 조건문 (0) 2017.06.25 [Kernighan - C] #2 - 10 지정 연산자와 수식 (0) 2017.06.25