개념 - 표준 입력 함수(2)
scanf 함수 사용해 잘못된 사용자 입력 처리하기
#include <stdio.h>
#include<stdlib.h>
void main() {
int num = 0;
while (1) {
printf("input age : ");
scanf_s("%d", &num);
if (num > 0 && num <= 130) {
break;
}
else {
printf("Incorrect Age!\n");
}
}
printf("your age : %d \n", num);
}
==> 이 코드는 괜찮아보이나 치명적인 오류가 존재한다
===>입력 버퍼에 저장되어 있는 잘못된 형식의 데이터가 계속 잔재하고 있어 무한적으로 오류가 발생함
====> 따라서 rewind 처리해서 버퍼안에 있는 것을 초기화 시켜줘야 한다
#include <stdio.h>
#include<stdlib.h>
void main() {
int num = 0;
while (1) {
printf("input age : ");
if (scanf_s("%d", &num) == 0) {
//scanf함수는 실행에 실패하면 0반환
//여기서는 정수만 받을 수 있는데 문자열 같은 거 입력시
//0이 출력되게 되어있는 것이다
rewind(stdin);
printf("[Enter] digit number!!!!\n");
}
else {
if (num > 0 && num <= 130) {
break;
}
else {
printf("Incorrect age !! \n");
}
}
}
printf("your age : %d\n", num);
}
- scanf함수는 실행에 실패하면 0반환
여기서는 정수만 받을 수 있는데 문자열 같은 거 입력 시
0이 출력되게 되어있는 것이다
연습문제
366p Q2
사용자에게 두개의 문자열을 입력받은 후에 strcat 함수를 이용해 두 문자열을 합친다
합친 문자열을 출력하는 프로그램을 작성하라
abc,def 입력받으면 abcdef라고 출력해야 한다,
- 이때 fgets 로 함수 받아야 한다, fgets는 엔터 누르면 마지막에 \n0 이렇게 엔터값까지 저장되버리고 만다. 이 엔터값 없애서 합쳐야 한다
#include <stdio.h>
#include <string.h>
void main() {
char a[15], b[15];
printf("input 1 : ");
fgets(a, sizeof(a),stdin);
printf("input 2 : ");
fgets(b, sizeof(b), stdin);
int l = strlen(a);
if (l > 0) a[l - 1] = 0;
strcat_s(a, sizeof(a), b);
printf("\n=> %s", a);
}
=> fgets에서 엔터값 없애는 방법 :
해당 문자열의 길이를 구하고 맨뒤에서 첫번째 아이, 즉 인덱스가 [길이-1]인 위치에 \n가 저장되어 있으므로 이거를 0으로 바꿔주면 된다!
Q3
입력받으면 출력하는 문젠데 계속 안된다. 어디가 문젠지 모르겠다
#include <stdio.h>
#include <string.h>
void main() {
double w, h;
char n[10],b;
int heart;
printf("Userdata : ");
scanf_s("%s %lf %lf %c %d", n, &w, &h, &b, &heart);
printf("이름 : %s, 몸무게 : %1fkg, 키 : %1fcm, 혈액형 : %c형, 심박수 : %d회", n, w, h, b, heart);
}
=> 안되던 이유 : 출처링크텍스트 기존에 scanf를 이용하신 경험이 있다면 크게 어렵지 않습니다. 대부분의 서식 지정자가 동일하거든요. 따라서 저는 이번에 초보시절 가장 헷갈려하는 부분을 소개하고자 합니다.
#include <stdio.h>
int main(void) {
char a, b, c;
char str[30];
scanf_s("%s %c %c %c", str, &a, &b, &c);
return 0;
}
이렇게 작성하면 문제를 일으킵니다. scanf_s는 scanf에서 발생 가능한 문제점을 해소하기 위해 새로 만들어진 함수입니다. 포인터로 변경했을 때, 길이가 특정되지 않은 데이터를 담는 변수 대해서는 [해당 변수 주소, 받을 문자열 길이]로 작성해주어야 합니다. 받을 문자열 길이는 변수가 담을 수 있는 공간보단 작아야겠죠.
#include <stdio.h>
int main(void) {
char a, b, c;
char str[30];
scanf_s("%s %c %c %c", str, 30, &a, 1, &b, 1, &c, 1);
return 0;
}
scanf_s에서 문자열을 입력받을 때는 char 기준 [배열 길이 - 1]의 값이 들어가야 합니다. 마지막 NULL문자를 넣기 위함입니다.
=>
#include <stdio.h>
#include <malloc.h>
#include <string.h>
void main() {
char n[10], b;
int heart;
float w, h;
printf("Userdata : ");
scanf_s("%s %f %f %c %d", n, 9, &w, &h, &b,1, &heart,2);
printf("이름 : %s, 몸무게 : %.2fkg, 키 : %.2fcm, 혈액형 : %c형, 심박수 : %d회", n, w, h, b, heart);
}
Q4
코드를 입력하세요
Author And Source
이 문제에 관하여(개념 - 표준 입력 함수(2)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@myway00/C-개념-표준-입력-함수2저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)