개념 - 표준 입력 함수(1)
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);
}
Author And Source
이 문제에 관하여(개념 - 표준 입력 함수(1)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@myway00/C-개념-표준-입력-함수저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)