반응형
먼저 아래의 소스코드를 보자.
1 2 3 4 5 6 7 8 9 | #include <stdio.h> int main() { char szStr[20]; gets(szStr); printf("%d",*szStr); return 0; } | cs |
이 코드를 실행해서 아무것도 입력하지않고 enter를 쳐주면 아마 '\0' 이 szStr[0]에 저장될 것이고 이것이 정수 형식으로 출력되므로 0이 나올 것이다. (szStr[0] 과 *szStr 이 같은 것을 출력한다는 것을 모른다면 ... 복습하고 오세욧)
결과는 0이나옵니다. (아스키코드값) 아스키코드 0은 NUL 문자입니다. (문자열 끝을 나타낼 때 쓰는 것) ('\0' 의 아스키코드는 0)
하지만 이 것은 어떨까요?
1 2 3 4 5 6 7 8 9 | #include <stdio.h> int main() { char szStr[20]; fgets(szStr,20,stdin); printf("%d",*szStr); return 0; } | cs |
fgets와 gets는 차이점이 있는데요 fgets는 개행문자 '\n' 을 문자열에 포함시킵니다. gets 는 개행문자를 문자열에 포함하지 않습니다.
결과는 10이나옵니다. (아스키코드값) 10은 LF(NL Line feed, new line) 을 의미합니다. 커서를 현재 행에서 다음 행으로 즉 아래로 내린다는 뜻입니다.
이번에는 7번 문제의 힌트를 읽어보겠습니다.
fgets(...,stdin) 를 사용하면 사용자로부터 한 줄의 문장을 받을 수 있다. 만약 fgets()가 0을 반환하면 공백 문자열이 입력된 것이므로 반복 루프를 종료하고 출력 파일을 닫으면 된다.
라고 써있는데요. fgets는 오류가 발생할 때 null pointer를 반환합니다. 파일 끝에 도달하였는데 아무런 문자를 읽지 못하였을 때는
문자열의 내용은 그대로 두고 null pointer를 반환합니다. (포인터 : NULL 이나 0 문자열 : 0이나 '\0' 이나 "")
1 2 3 4 5 6 7 8 | #include <stdio.h> int main() { char szStr[20]; printf("%d",fgets(szStr,20,stdin)); return 0; } | cs |
그렇다면 fgets 로 szStr을 받는데 아무것도 입력하지 않고 엔터를 쳤을 경우 NULL 포인터가 반환되니 값이 0이 나와야 하는데 그것을 확인해 보겠습니다.
나오지 않습니다. 심지어 주소도 실행 할 때마다 계속 바뀝니다. 그렇다면 get는 어떨까요
1 2 3 4 5 6 7 8 | #include <stdio.h> int main() { char szStr[20]; printf("%d",gets(szStr)); return 0; } | cs |
똑같이 어떤 특정한 주소값이 나오고 할 때마다 계속 바뀝니다.
1 2 3 4 5 6 7 8 | #include <stdio.h> int main() { int *p=NULL; printf("%d",p); return 0; } | cs |
그리고 포인터를 NULL 로 초기화 (NULL 이랑 0은 같은것임 포인터에서) 하였을 때 주소값이 0이나오는지 확인해 보았더니 맞는 말이었습니다.
결론적으로 힌트에 나와있는 말이 실제로 그렇게 되지 않는 다는 것을 알 수 있습니다.. 그래서 다른 방법으로 코딩을 해 보겠습니다.
사용자가 입력하는 텍스트를 파일에 저장하여 주는 프로그램을 작성하여 보자. 사용자가 공백 문자열을 입력하면 입력을 종료하는 것으로 가정한다.
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 34 | #include <stdio.h> #include <stdlib.h> #define SIZE 100 int main(void) { FILE *fp=NULL; char name[SIZE]; char line[SIZE]; int count1,count2,i; printf("파일 이름을 입력하세요: "); gets(name); if((fp=fopen(name,"w"))==NULL) { printf("파일 열기 오류\n"); exit(1); } while(1) { line[0]='\0'; count1=0;count2=0; fgets(line,SIZE,stdin); for(i=0;line[i]!='\0';i++) { count1++; if((line[i]==' ')||(line[i]=='\t')||(line[i]=='\n')) {count2++;} //개행문자도 해주는 이유는 무조건 들어가는 문자이기 때문 } //총 글자수와 공백 문자 수를 비교하여 같으면 프로그램 종료, 다르면 계속 실행 if(count1==count2) break; fputs(line,fp); } fclose(fp); return 0; } | cs |
괜히 힌트 때문에 시간을 버렸네요.
문자열 내 모든 문자(\n포함 ) 수와 문자열 내 모든 공백문자 (\t, ' '를 세는데 \n 도 포함합니다. 왜냐하면 무조건 들어가는 문자이기 때문)
수를 비교하여 같으면 프로그램 종료, 다르면 계속 진행하게 코딩하였습니다.
반응형
'컴퓨터 & 프로그래밍 & 전자공학 > C언어' 카테고리의 다른 글
도서 관리 프로그램 (0) | 2017.02.17 |
---|---|
줄 번호 붙이기 (0) | 2017.02.17 |
인쇄 가능 문자 수 세기 (0) | 2017.02.13 |
성적 평균 구하기 (0) | 2017.02.12 |
텍스트 파일 비교 (0) | 2017.02.11 |