FW 심화 과정/[2] STM32심화실습

0727 C프로그래밍 기초 14강

천숭이 2022. 7. 27. 23:41

# 표준 입력 함수

입력 버퍼는 특정 키를 누를 때가지 사용자 입력을 임시로 저장.

따라서 남아있던 글자가 나옴으로써 원하지 않는 결과가 나올 수 있음

 

# rewind

rewind 함수를 이용해 버퍼를 청소할 수 있다

 

# getchar

키보드로부터 문자 하나를 입력받는 표준 입력 함수

문자 한 개를 입력 받더라도 enter키를 눌러야만 작업이 완료됨

 

 

# 해결 방법1

엔터키를 한 번 더 호출해 enter키 값을 제거

 

# 해결 방법2

rewind 함수를 사용해 버퍼내에 남아있는 문자 제거

 

#include <stdio.h>

void main()
{
	int input_data;
	input_data = getchar();
	printf("input : %c \n", input_data);
	// 첫글자만 출력됨 

	rewind(stdin);
	input_data = getchar();
	printf("input : %c \n", input_data);	
}

- 위 코드에서 rewind가 없으면 출력이 원하는 형태로 나오지 않음

 

 

# gets

문자열 입력 함수

char input_string[10];
gets(input_string);

 

# 문자열을 위한 gets

입력 버퍼에 엔터키를 남지 않는다

enter키 입력한 위치에 NULL 문자 0 이 추가된다

 

표준 입력을 받는 중 CTRL+C키를 입력하면 정상종료가 되지 않음

-> 따라서 if구문을 줌으로써 NULL이 아닐때만 출력하는 형태

 

#include <stdio.h>

void main()
{
	// getchar
	int input_data;
	input_data = getchar();
	printf("input : %c \n", input_data);
	// 첫글자만 출력됨 

	rewind(stdin);
	input_data = getchar();
	printf("input : %c \n", input_data);	
	
	// 문자 gets
	rewind(stdin);
	char input_string[10];
	gets(input_string);
	printf("input : %s \n", input_string); // 문자열 출력 
	
	// 문자열 gets
	if (NULL != gets(input_string)){
		printf("input : %s \n", input_string);
	} 
	else {
		printf("input -> Canceled \n");
	}

}

 

 

 

<문자열을 입력 받을 때 키 입력 횟수 제한하기>

#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;
		}
	}
	// out of range 
	buffer[i] = 0;
	rewind(stdin);
	return 0;
}

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

 

 

# 문자열을 정수로 변환하기

- gets 함수로 입력받은 것들은 문자열로 입력받기 때문에 정수형을 원할때는, 따로 변환을 해야 한다.

 

 

방법 1.

아스키코드 표를 이용해 문자에서 '0'을 뺀다.

 

방법2. 

자릿수를 체크해 10의 배수 pos_num을 만들고, 한 자리씨 추출할때마다 pos_num을 곱하고 10으로 나눈다.

// 문자열을 정수로 변환하기 -> 세자리밖에 정수로 변환못함 
#include <stdio.h>
#include <string.h>
/*
void main()
{
	int pos_num =100, num = 0, i, temp_num;
	char num_string[4] = "123";
	
	for (i=0;i<3;i++)
	{
		temp_num = num_string[i] - '0';
		num = num + temp_num * pos_num;
		pos_num = pos_num / 10;
	}
	printf("%s -> %d \n", num_string, num);
 } */
 
 void main() // ->upgrade 방식 
 {
 	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 *= 10;
 	
 	for(i=0; i<count;i++){
 		num += (num_string[i] - '0') * pos_num;
 		pos_num /= 10;
	 }
	 printf("%s -> %d \n", num_string, num);
  }

 

방법3.

더 간단하게 문자열을 정수로 변환하는 방법

#include <stdio.h>
#include <string.h>
void main()
{
    int num =0, count =0;
    char num_string[4] = "123";

    while(num_string[count] != 0){
        num = num * 10 + (num_string[count] - '0');
        count++;
      }
      printf("%s -> %d \n", num_string, num);
}

 

<gets 함수를 이용해 두 개의 숫자를 입력 받아 연산하기>

 

 

 

 

# atoi 함수 사용하기

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

int 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);
}