Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
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
Tags
more
Archives
Today
Total
관리 메뉴

kaka09

atoi 와 fgets의 사용법 및 분석 본문

Programing/C

atoi 와 fgets의 사용법 및 분석

kaka09 2017. 8. 6. 23:22

atoi


 #include <stdlib.h>  


int atoi ( const char * str )


atoi 함수는 문자->정수로 변환시켜주는 함수 


입력받은 문자('12345') 아스키형태를 int형의 12345로 변환 된다.  이때 주의할점은 0~9 이외의 값이 들어오면 atoi는 0을 반환한다.

또한 숫자 앞에 +,- 같은 기호가 올 수도 있다.





1
2
3
4
5
6
7
8
9
#include <stdio.h>
 
int main(int argc, char * argv[]){
        char * str;
        str=argv[1];
        printf("result: %d\n",atoi(str));
        return 0;
}
 


다음과 같은 예제의 소스코드를 작성해보자.. 실행할때 인자로 받은 문자열을 atoi를 거쳐 숫자로 변환시켜 출력시키는 프로그램이다.







실행결과 다음과 같이 결과과 반환 된다.




fgets


 #include <stdio.h> 


char * fgets ( char * str, int num, FILE * stream );


fgets는 파일이나 입력스트림으로 부터 문자열을 받는 함수


파일이나 입력스트림으로부터 문자열을 받을 수 있다. 이때 num-1 만큼의 길이를 받을 수 있다. 파일은 EOF를 만나기 전까지 입력받을 수 있고, 입력 스트림은 개행문자(\n)을 만나기 전까지 입력을 받는다. 


*주의사항*


 

1
2
3
4
hihi
test
kaka
hehe
cs


다음과 내용의 파일이 있다 가정하고 이를 fgets로 읽어 들이는 프로그램을 작성해보자





1
2
3
4
5
6
7
8
9
10
#include<stdio.h>
 
int main(){
        char buf[20];
        FILE * fp;
        fp=fopen("/tmp/test","r");
        fgets(buf,sizeof(buf)-1,fp);
        printf("result: %s\n",buf);
}
 
cs

다음과 같이 소스코드를 작성하고 컴파일하여 실행하면 결과는 다음과 같다.




hihi 라는 한줄만 출력이 된 것을 확인할  수 있다.  왜 이런 결과가 나왔을까?? 정답은 간단하다. fgets는 개행문자를 만나면 읽어들일 문자열의 끝으로 간주한다. 파일은 EOF를 만나기 이전이라도 일단 개행문자를 만나면 fgets는 문자열을 개행문자 이전까지 읽어들인다. 그리고 개행문자 다음에 문자열이 존재한다면 포인터를 한칸 증가시킨다.  무슨말인지 이해가 잘 안된다면 다음의 예제를 살펴보자



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<stdio.h>
 
int main(){
        char buf[20];
        FILE * fp;
        fp=fopen("/tmp/test","r");
        fgets(buf,sizeof(buf)-1,fp);
        printf("result: %s\n",buf);
        
        fgets(buf,sizeof(buf)-1,fp);
        printf("result: %s\n",buf);
 
        fgets(buf,sizeof(buf)-1,fp);
        printf("result: %s\n",buf);
 
        fgets(buf,sizeof(buf)-1,fp);
        printf("result: %s\n",buf);
 
}
 
 
cs

이번에는 방금 작성했던 프로그램에서 fgets를 3번 추가시켰다. 그리고 결과를 확인하자




이번에는 파일내용 모두 출력 된 것을 확인할 수 있다.  이는 fgets를 연속적으로 호출함으로서 포인터가 가리키는 내용 모두를 출력시키기 때문이다.  



파일에는 줄마다 개행문자가 포함되므로 fgets 호출시 개행문자 이전까지의 문자열을 읽어들이고 포인터를 다음 문자열을 가리키도록 위치시킨다. 그리고 fgets를 한번 더 호출하면 포인터가 가리키는 곳에서부터 문자열을 읽어들인다. 물론 여기서도 개행문자 이전까지 문자열을 읽어들인다음 파일의 내용이 더 있다면 포인터를 다음 내용을 가리키도록 이동시킨다. 


fgets를 이용해 파일의 내용을 이나 stdin으로 입력값을 받아들일때 이러한 개념들을 충분히 알아두면 코딩에 도움이 될 것이다.