[C] 문자, 문자열

2021. 1. 6. 20:17프로그래밍 공부/C 공부

[표준입력장치 동작원리]
(1) 입력장치에서 입력값 발생
(2) 버퍼에서 임시 저장
(3) 엔터등과 같은 입력 완료 신호 발송
(4) 출력

-버퍼 초기화
 만약 입력을 3가지해서 버퍼에 3가지의 값이 있는데 출력을 하나만 했다면 
 버퍼에는 2개가 남아있는 상황이 된다. 
 따라서 다음 입력때는 기존에 입력되어있던 값들이 먼저 나온다.
 때문에 버퍼를 초기화 해줘야하는데 이는 rewind키워드와 stdin 포인터를 이용한다.
 rewind(stdin);

 

[문자와 문자열 입력함수] 

 getchar() :문자 1개 입력 <<ex>> int input_data = getchar();
 getchar() 주의사항
 1. 기본적으로 getchar()데이터는 int형에 부여되도록 되어있으나, char로 설정해도 문제없다.
 2. Enter값 역시 getchar() 함수가 input으로 받아들이기 때문에 문자, 혹은 문자열을 받는 함수를 2개 이상 사용할때는 
   하나를 사용한 후 rewind(stdin); 을 해주는게 좋다. 
 
 getc() : 문자 1개를 입력 <<ex>> input_data = getc(stdin);
 getchar는 getc를 이용해서 만든 함수임, stdin이라는 포인터를 계속 받아야하는게 복잡해서!
 getc는 표준 입출력뿐만 아니라 파일 입출력에도 사용됨
 파일을 열고 해당 파일 포인터를 getc함수의 매개변수에 넣으면 파일에서 1바이트씩 정보를 읽어 사용자에게 전달해주는 역할을 함

 gets() : 문자열을 입력 받는 표준 입출력함수 <<ex>> char str[10] ; gets(str);
 문자열을 저장하기 위해서는 gets함수의 매개변수에 char배열로 선언된 변수의 시작 주소를 넘겨주어야함.

 왜 주소를 넘겨주는데 그냥 gets(str); 이라고만 할까? 
 배열의 주소를 넘겨주는것은 정확히 쓰면 &str[0]이다. 즉 배열의 첫번째 요소의 주소를 주는 것이다.
 하지만 문자열의 경우 컴파일러가 gets(str)이라고만 쓰면 똑같이 해석한다.

 *주의사항*
 (1) 오류1 
 gets는 입력도중 프로그램이 종료되면 버퍼문제로 다음 출력에서 의도치 않은 결과가 나타난다.
 이는 gets가 정상적이지 않다면 NULL을 반환하는 속성을 통해 확인, 방지할 수 있는데, 다음의 코드가 그 예이다.

 if(NULL != gets(str)){pirntf("input : %s\n", str");}
 else {printf("input -> Canceled\n");}

 (2) 오류2
 gets 함수는 지정된 저장공간 이내에서만 문자열을 만들도록 제한하는 기능이 없음.

 만약 gets()가 없다면 fgets()를 쓰면된다. 쓰는 형식은 다음과 같다. <<ex>> char str[10]; fgets(str, 10, stdin); 
 여기서 10은 저장할 메모리의 최대크기임.

'프로그래밍 공부 > C 공부' 카테고리의 다른 글

[C] scanf 함수 2  (0) 2021.01.07
[C] scanf 함수 1  (0) 2021.01.07
[C] void 포인터  (0) 2021.01.06
[C] 포인터 활용  (0) 2021.01.06
[C] 포인터 개념  (0) 2021.01.06