개념 - 표준 입력 함수(1)

25054 단어 CC

rewind - 입력 버퍼 초기화

rewind(stdin)

  • 표준 입력 버퍼를 초기화
  • 입력 버퍼에 입력한 키 정보가 남아있다면 사용자가 추가로 입력하지 않아도 함수가 동작하게 됨
    => 따라서 입력 구별하고 싶다면 rewind 사용해 입력버퍼 초기화 해야 한다
    => rewind 사용하면 두번째 입력 함수에 영향을 미치지 않는다

getchar - 문자 한 개 입력받음


#include <stdio.h>

void main() {
	int input_data;
	input_data = getchar();
	printf("input : %c\n", input_data);
}

=> 한문자만 출력된다

  • 문제점 有 :
    두 번 getchar을 사용할 때 처음 입력했던 getchar()에 의해서

다음 getchar은 표준입력 버퍼에 남아 있는 \n 출력하고 끝나버린다

=> _rewind로 해결하기

#include <stdio.h>

void main() {
	int input_data = getchar();
	rewind(stdin);
	printf("first input : %c\n", input_data);
	input_data = getchar();
	rewind(stdin);//남아있는 야둘 더 자유ㅗ쥼
	printf("second input : %c\n", input_data);
}

getc 함수 : 1바이트씩 정보 읽기

input_data=getc(stdin)

  • 파일에서 1바이트씩 정보를 읽어 사용자에게 전달해주는 역할

gets 함수 : 문자열 입력 받음

  • 엔터키 입력할 때까지 입력한 모든 문자를 하나의 문자열로 간주
  • 문자열 저장하기 위해 gets 함수의 매개변수에 char 배열로 선언된 변수의 시작 주소 넘겨줘야 함

char input_string[10];
gets(input_string);

(1)

#include <stdio.h>

void main() {
	char input_data[10];
	gets(input_data);
	printf("input : %s\n", input_data);
}

=> 엔터키까지 입력버퍼에서 읽어와 처리하므로 입력버퍼에 엔터키가 남아있지 않음

  • rewind 사용해 버퍼 초기화할 필요 없음, 그렇다고 엔터키값을 문자열에 포함시키는 것도 아니고 입력완료의 기준인 0으로 받는다
  • gets 로 문자열 입력받을 때 사용자가 정상적으로 입력 완료하지 않는 상황에 대처할 수 있도록 코드 구성해야 한다==> 사용자가 정상적으로 입력 완료X면 NULL을 반환

(2) : gets 함수로 문자열을 입력 받을 때 입력 취소(Ctrl + c)까지 처리하기

#include <stdio.h>

void main() {
	char input_string[10];
	if (NULL != gets(input_string)) {
		printf("input : %s\n", input_string);
	}
	else {
		printf("\ninput -> Canceled\n");
	}
}

(3) 문자열 입력 받을 때 입력 취소까지 처리하기***

#include <stdio.h>

int GetMyString(char buffer[],int limit) {
	int i;
	for (i = 0; i < limit; i++) {
		buffer[i] = getchar();
		if (buffer[i] == '\n') {
			buffer[i] = 0;
			return 1; //정상 종료 되었다
		}
	}
	buffer[i] = 0;
	rewind(stdin);//표준 입력 버퍼에 남아있는 문자들 제거함
	return 0;
}

void main() {
	char temp[10];
	int state;
	state = GetMyString(temp, 9);
	if (state == 1) printf("input : %s\n", temp);
	else printf("input : %s -> input out of range\n", temp);
}

문자열을 정수로 변환해 사용

1. 아스키 코드 값 이용

#include <stdio.h>
#include<string.h>
void main() {
	int pos_num = 1, num = 0, i, count;
	char num_string[4] = "123";
	count = strlen(num_string);
	for (i = 0; i < count - 1; i++)pos_num = pos_num * 10;
	for (i = 0; i < count; i++) {
		num = num + (num_string[i] - '0') * pos_num;
		pos_num /= 10;
	}
	printf(" %s -> %d\n", num_string, num);
}

2. 명령 반복시 마다 10을 곱하기

#include <stdio.h>
#include<string.h>
void main() {
	int num = 0, count = 0;
	char num_string[5] = "1000";
	while (num_string[count] != 0) {
		num = 10*num + (num_string[count] - '0');
		count++;
	}
	printf(" %s -> %d\n", num_string, num);
}

숫자 형식의 문자열을 처리하는 함수 만들기

gets 함수 사용해 두개의 숫자를 입력받아 합산하기

#include <stdio.h>
#include<string.h>
int ArrayToInteger(char string[]) {
	int count = 0, num = 0;
	while (string[count] != 0) {
		num = num * 10 + string[count] - '0';
		count++;
	}
	return num;
}
void main() {
	int first_num, second_num;
	char first_string[16], second_string[16];
	printf("input first number : ");
	gets(first_string);
	printf("input second number : ");
	gets(second_string);
	first_num = ArrayToInteger(first_string);
	second_num = ArrayToInteger(second_string);
	printf("#d+%d=%d\n", first_num, second_num, first_num + second_num);
}

=> 만약 gets 대신 fgets쓴다면 문자열 끝에 \n 이 추가되어 정상적인 결과가 나오지 않음
==> string[count] 값이 문자열 끝을 의미하는 NULL 문자 0과 같을 때까지 반복하기 때문에
\n또한 숫자 처리 되기 때문이다
===> fgets사용위해선 6행을
while(string[count]!=0&&string[count]!=\n){
라고 수정해줘야 한다
이렇게 되면 string[count]값이 0이나 \n과 같을 때 중단되기 때문에 \n문자가 숫자로 변환되어 문제가 해결

fgets, gets, scanf 차이

출처 : 링크텍스트

atoi함수를 사용해 문자열을 정수로 반환

#include <stdio.h>
#include<stdlib.h>

void main() {
	int first_num, second_num;
	char first_string[16], second_string[16];
	printf("input first number : ");
	gets(first_string);
	printf("input second number : ");
	gets(second_string);
	first_num = atoi(first_string);
	second_num = atoi(second_string);
	printf("%d+%d=%d\n", first_num, second_num, first_num + second_num);
}

좋은 웹페이지 즐겨찾기