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

19203 단어 CC

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

코드를 입력하세요

좋은 웹페이지 즐겨찾기