반응형

먼저 아래의 소스코드를 보자.


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

+ Recent posts