#C언어
262022.05.25
인플루언서 
담담
2,184IT테크 전문블로거
참여 콘텐츠 10
6
형식화된 입력에 사용하는 scanf() 함수 (C 언어)

scanf() 함수는 출력에 사용하는 printf() 함수처럼 포맷지정자를 사용해서 키보드에서 다양한 형식으로 데이터를 입력받는 것이 특징입니다. scanf() 함수의 사용형식은 다음과 같습니다. 이 함수는 "&num", "&i"와 같이 변수의 주소를 의미하는 "&" 문자를 입력받을 변수명 앞에 기술해야 합니다. 여러 개의 값을 입력받을 때는 화이트 스페이스(공백키, 탭키, 엔터키)나 콤마로 입력 데이터를 구분합니다. 문자열을 입력받을 때는 배열을 사용하며, 배열명 앞에는 "&" 문자를 기술하지 않습니다.(배열이나 char형 포인터는 뒤에서 배울 것입니다) 이 함수를 사용할 때는 입력 값과 포맷지정자를 정확히 일치시켜야 오류가 발생하지 않습니다. 이 함수에서 자주 사용하는 포맷지정자는 다음과 같습니다. printf() 함수는 모든 실수에 %f를 사용해도 되었지만, scanf() 함수는 double은 %lf, long double은 %Lf를 사용한다는 점이 다릅니다. C99 표준 부터는 scanf() 함수를 사용하면 경고 메시지가 표시됩니다. scanf() 함수는 입력되는 문자의 크기(길이)에 대한 정보를 기술하지 않아 메모리 오류를 발생시키는 경우가 있기 때문입니다. 그래서 가능한 이 함수를 사용하지 말 것을 권장합니다. 그러나 그런 권고를 받아들이는 수준이 컴파일러에 따라 다르고, 아직도 scanf() 함수를 많이 사용하고 있기 때...

2021.01.02
C의 데이터 형 (C언어 코딩과 알고리즘)

초보자가 C로 취업을 하려면 앞에서도 보았듯이 프로그램 내에서는 변수와 상수(값)를 사용하게 됩니다. C 언어는 그런 변수와 상수를 어떻게 사용해야 하는지를 문법으로 정해놓았습니다. 사실 프로그래밍 언어는 모두 문법 덩어리이지요. 인간은 지능이 있어서 대충 눈치만 줘도 알아차리지만 컴퓨터는 IC가 가득찬 전자장치일 뿐입니다. 문법에 정의된 점 하나만 안찍어도 못 알아듣고 에러를 발생시킵니다. 그렇게 프로그래밍 언어마다 정밀하게 정의된 문법이 있고, 그 문법에 준해서 컴퓨터와 소통을 하게 됩니다. 따라서 C로 프로그램을 작성하려면 C 언어가 문법으로 정해놓은 데이터의 형식을 익혀야 합니다. C 언어에 정의되어있는 데이터 형은 다음과 같습니다. 우리는 학습을 해가면서 이 형식들을 하나씩 배우게 됩니다. 이 장에서는 먼저 가장 기본적으로 사용되는 "정수형", "실수형", "문자형"을 배울 것입니다. 데이터는 상수와 변수가 있으며, 이들의 데이터 형은 다음과 같이 구분합니다. • 상수는 값만 기술하거나 값 뒤에 문자 접미사를 붙여 구분합니다. (예) 10, 10L, 10l, 10.5, 10.5F, ... • 변수는 변수 이름 앞에 데이터 형을 지정해서 구분합니다. (예) int num1, float num2, double num3, ...

2021.01.02
2
표준입력함수와 표준출력함수 (C언어 코딩과 알고리즘)

초보자가 C로 취업을 하려면 C에서는 키보드(표준입력장치)를 이용해서 데이터를 입력받을 때 사용(호출)하는 함수를 표준입력함수라고 하고, 모니터(표준출력장치)에 데이터를 출력할 때 사용하는 함수를 표준출력함수라고 합니다. 우리는 지금까지 printf()라는 표준출력함수만을 사용해보았으나, 전통적인 C 언어는 다음의 표와 같은 표준입출력함수를 제공합니다. 이런 표준입출력함수를 사용하려면 프로그램의 선두에 #include <stdio.h> 지시어를 기술해야 합니다. 여기서 "stdio"는 "standard input output", 즉 "표준입력과 표준출력"을 의미하는 것입니다. "stdio.h"는 표준입출력을 위한 헤더(header) 파일이며, 이 파일에는 표준입출력함수에 대한 정보가 기록되어 있습니다. 그 파일을 내 프로그램에 포함시키는 것이 #include <stdio.h> 지시어인데 표준입출력함수는 가장 기본적인 함수이기 때문에 #include <stdio.h> 지시어는 생략할 수도 있습니다. 표준입출력함수의 변화 C89/90 표준까지는 앞의 함수들이 표준입출력함수로 정의되었으나, 기존의 scanf()와 gets() 함수가 에러에 취약한 약점이 있어 C99 표준부터 이 함수들에 변화가 생깁니다. 그래서 과거와 달리 지금 시점에서는 이 함수들을 표준입력함수라고 말하기가 좀 어색한 측면이 있습니다. 하지만 아직도 이 함수들을 사용하는...

2020.12.20
3
데이터 형의 변환 (C언어 코딩과 알고리즘)

초보자가 C로 취업을 하려면 상수와 변수는 서로 형을 일치시켜서 사용하는 것이 제일 정확한 결과를 얻을 수 있습니다. 그러나 연산을 하다보면 정수형 변수에 실수를 할당하거나, 정수형 변수와 실수형 변수로 곱셈을 하는 등 데이터 형을 혼합해서 사용하게 됩니다. 그렇게 데이터 형을 혼합해서 연산문을 구성하면 실제 연산을 할 때는 데이터 형들이 동일한 형으로 일치되어 연산이 되며 이 과정에서 데이터의 형 변환이 필요합니다. 데이터 형 변환은 묵시적 형 변환(implicit type conversion)과 명시적 형 변환(explicit type conversion)이 있습니다. 묵시적 형 변환은 컴퓨터 내부에서 자동으로 발생하는 형 변환이며, 명시적 형 변환은 프로그래머가 프로그램 내에서 의도적으로 형을 변환하는 것을 말합니다. 묵시적 형 변환 묵시적 형 변환은 2가지 경우를 생각할 수 있습니다. 첫째는 변수에 값을 할당하는 경우이고, 둘째는 데이터 형을 혼합해서 연산을 하는 경우입니다. 변수에 값을 할당하는 경우 이 경우는 왼쪽의 변수형에 맞춰 자동으로 형 변환이 일어나며, 실수 상수의 경우 소수부 손실이 발생합니다. 다음 프로그램을 봅시다. ▶ 실행 결과 ▶ 소스 코드 03_08.c #include <stdio.h> int main(void) { // 정수형 변수에 소수점 형식과 지수 형식으로 실수를 할당 int inum1 = 6.78...

2020.12.20
switch 조건문 (C 언어)

1도 모르면서 C로 취업을 하려면 여러 개의 조건을 다양하게 검사할 때는 if - else if 문을 사용하면 됩니다. 그러나 여러 개의 조건을 검사할 때 switch 문을 사용하면, 한계가 있기는 하지만, 훨씬 더 단순하고 이해하기 쉬운 형식으로 코드를 작성할 수 있습니다. switch 문의 형식은 다음과 같습니다. "조건식"의 결과 값과 일치하는 "case 값"을 찾아서 해당 "참문장"을 실행한 후, "break" 문에 의해 switch 블록을 벗어나 "다음문장"을 실행합니다. switch 문은 다음과 같은 사용 규칙이 있습니다. 조건식과 case 값이 정수형 값이어야 한다는 한계를 유의해야 합니다. • 조건식 : 조건식의 결과 값은 반드시 정수형 값이어야 한다. 따라서 정수형 상수나 논리식, 문자를 사용할 수 있다. 논리식은 참이면 정수 1, 거짓이면 정수 0을 반환하므로 사용할 수 있다. 문자 상수도 ASCII 코드 값이 정수이므로 사용할 수 있다. • case 값 : case의 값은 정수형 상수 또는 정수형 상수만으로 구성된 식을 기술한다. 문자 상수도 기술할 수 있다. • default : 조건식의 결과 값과 case 뒤의 값이 모두 일치하지 않을 때 실행된다. 필요에 따라 default는 생략할 수도 있다. switch 문을 사용해서 산술 계산기를 만들어 봅시다. 다음 프로그램은 2개의 숫자와 1개의 연산자를 입력 받아 ...

2021.06.06
2
배열의 개요 (C언어)

1도 모르면서 C로 취업을 하려면 배열(array)은 동일한 데이터 형의 변수가 많이 필요할 때 사용합니다. 예를 들어, 100명의 점수를 입력받아 등수를 구한다고 가정해봅시다. 등수를 구하려면 입력되는 100명의 점수를 모두 보관하고 있어야 하므로, score1, score2, score3, ...., score100과 같이 100개의 변수가 필요합니다. 이럴 때 다음과 같은 형식으로 배열을 선언하면 간단히 100개의 변수를 만들 수 있습니다. 이런 배열 선언은 한꺼번에 여러 개의 기억공간을 확보할 뿐 변수 선언과 크게 다르지 않습니다. 위의 score 배열을 구성하는 100개의 정수형 변수를 배열의 요소(element)라고 합니다. 여기서 주의할 것은 배열의 크기를 100으로 선언하면 다음과 같이 score[0]부터 score[99]까지 요소가 만들어진다는 것입니다. 배열의 요소는 0번부터 시작하기 때문에 0번부터 99번까지 요소가 생깁니다. 또한 배열을 반복문과 함께 사용하면 많은 데이터에 대한 연산을 간단히 코딩할 수 있습니다. 예를 들어, score 배열 내의 모든 숫자를 더해야 한다면 다음과 같은 코드를 사용할 수 있습니다. for (i=0; i<100; i++) // i 값이 0에서 99가 될 때까지 반복 sum += score[i]; // score[0]부터 score[99]까지 100개의 요소 값을 더함 배열을 구성하...

2021.06.05
전처리기의 역할 (C언어)

초보자가 C로 취업을 하려면 1장에서 언급했지만 프로그램을 작성한 후 그 프로그램을 실행시키기 위해서는 다음 그림과 같은 과정이 필요합니다. 컴파일러의 역할은 프로그래머가 작성한 소스 파일을 번역해서 기계어로 구성된 오브젝트 파일(Object File)을 생성하는 것입니다. 그런데 컴파일러에는 전처리기(Preprocessor)라는 모듈이 포함되어 있어 기계어로 컴파일(번역)하기 전에 전처리 작업을 수행합니다. 전처리기의 특징과 역할은 다음과 같습니다. ➊ 소스 파일의 코드 중에 전처리기가 처리할 내용은 "#include"와 같이 "#" 문자로 시작되며 이런 문장을 "전처리 기 지시자" 또는 "전처리 지시자"라고 합니다. ➋ 전처리기 지시자는 1행에 1개 문장만을 기술하며 뒤에 세미콜론(;)을 기술하지 않습니다. ➌ 소스 파일 내에 다른 파일을 포함시킵니다. ➍ 소스 파일 내의 특정 문자열을 다른 문자열로 대치합니다. ➎ 소스 파일 중 일부를 조건에 따라 컴파일할 수 있게 합니다. 이 장에서는 다음과 같은 전처리기 지시자의 사용법을 살펴볼 것입니다. • 매크로 상수와 매크로 함수를 정의하는 #define 지시자 • 다른 파일을 포함시키는 #include 지시자 • 조건부 컴파일을 위한 #if, #elif, #else, #endif, #ifdef, #ifndef, #undef 지시자 • #line, #error, #pragma 등의 기타...

2021.06.04
Syntax error와 Semantic error(C 언어)

초보자가 C로 취업을 하려면 우리가 프로그램을 작성하면서 흔히 발생시킬 수 있는 에러는 다음과 같이 2가지가 있습니다. • 신택스 에러(syntax error) : 컴파일러가 에러 메시지를 발생시키는 에러입니다. 대개 C 언어의 철자법을 틀려서 발생하는 에러입니다. • 시맨틱 에러(semantic error) : 컴파일러가 에러 메시지를 발생시키지 않는 에러입니다. 의미 에러라고 하며, 프 로그래머가 연산의 우선 순위를 잘못 생각했거나, 연산식을 잘못 구성해서 엉뚱한 값이 출력되는 에러입니다. 대 부분 디버거를 사용하여 관련된 변수값을 추적하여 에러를 수정합니다. 정수의 2제곱 값과 3제곱 값을 구하는 다음 코드는 프로그래머의 착각에 의한 "시맨틱 에러"를 가지고 있습니다. ▶ 실행 결과 n1 = 3 n1의 2제곱 = 9 n1의 3제곱 = 81 ▶ 소스 코드 05_13.c #include <stdio.h> int main(void) { int n1, n2, n3; n1 = 3; n2 = n1 * n1; // 01 n3 = n2 * n2; // 02 printf("n1 = %d\n", n1); printf("n1의 2제곱 = %d\n", n2); printf("n1의 3제곱 = %d\n", n3); return 0; } ▶ 소스 코드 해설 01-02 : 01 라인은 올바로 2제곱을 계산합니다. 그러나 02 라인은 3제곱이 아니라 4제곱...

2021.05.26
C99 표준에 추가된 논리연산자(C 언어)

초보자가 C로 취업을 하려면 C99 표준부터는 논리연산자에 대한 매크로(매크로는14장에서 학습)가 추가되어 다음의 표와 같이 기호가 아닌 단어로 연산자를 기술할 수 있습니다. 단, 매크로 사용을 위해서 프로그램의 선두에 "#include <iso646.h>" 문을 추가해야 합니다. 앞의 예제 코드에서 테스트해보세요. C에서 이런 연산자를 처음부터 표준으로 채택하지 않은 것은 가능한 언어를 간결하게 만들려는 C 언어의 기본철학 때문이라고 합니다.

2021.05.26
2
문자만 입력하는 getchar() 함수(C 언어)

초보자가 C로 취업을 하려면 getchar() 함수는 문자만을 입력받는 전용 함수이기 때문에 scanf() 함수와는 달리 포맷지정자를 사용하지 않아 간단합니다. 이 함수의 사용 형식은 다음과 같습니다. 키보드에서 입력되는 1개의 문자가 변수에 할당됩니다. getchar() 함수를 사용하는 다음 프로그램을 봅시다. ▶ 실행 결과 ▶ 소스 코드 04_15.c #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main(void) { int number; char sex; printf("번호 : "); scanf("%d", &number); getchar(); // 01 printf("남자(M) / 여자(F) : "); sex = getchar(); // 02 printf("\n번호 : %d", number); printf("\n성별 : %c \n\n", sex); return 0; } ▶ 소스 코드 해설 01 : 숫자를 입력한 후 사용자가 누른 Enter 키가 버퍼에 남아 있어 그 Enter 키 값을 읽어들입니다. 02 : 사용자가 문자를 입력하고 Enter 키를 누르면 그 문자가 sex 변수에 기억됩니다.

2021.05.26