반응형

C언어 문자열 함수

C언어에서 사용하는 문자열은 다양한 함수를 사용해서 변경이 가능합니다.

오늘은 문자열을 다루는 함수에 대해서 알아보겠습니다.

먼저 문자열 함수를 사용하기 위해서는 string.h 헤더를 추가해야 합니다.

 

더보기
문자열 길이 확인 strnlen_s

이전 강좌에서는 자료형 크기를 확인하는 sizeof함수를 사용해서 문자열 길이를 확인했습니다.

sizeof 경우 포인트를 사용한 문자열일 경우 포인트 크기만 확인하게 됩니다.

그래서 정확한 문자열을 확인할 수 없습니다.

반면 strnlen_s는 null문자열을 제외한 크기를 바이트 단위로 확인합니다.

#include <stdio.h>
#include <string.h>
int main(void)
{
	
	char strValue[] = "this is strnlen_s";

	int strSize = strnlen_s(strValue, sizeof(strValue));


	printf(" %s 문자열 크기는 = %d\n", strValue, strSize);
	printf("\n");

	return 0;
}

string.h 헤더를 추가하고 strnlen_s를 사용해서 문자열 길이를 확인했습니다.

C언어 문자열 함수

문자열 사용 시 함수 뒤에 "_s" 함수를 사용하면 보안 취약점을 개선할 수 있습니다.

문자열 크기를 정확하게 확인하기 때문에 중간 변조에 대해서 방어할 수 있습니다.

 

더보기
문자열 복사 strcpy_s

문자열을 복사하기 위해서는 strcpy_s를 사용해서 복사할 수 있습니다.

#include <stdio.h>
#include <string.h>
int main(void)
{
	
	char strCopy1[] = "this is copy";
	char strCopy2[] = "strcpy";

	strcpy_s(strCopy1, sizeof(strCopy1), strCopy2);

	printf(" 복사된 문자열은 \" %s \" 입니다.\n", strCopy1);
	printf("\n");

	return 0;
}

strCopy1 문자열에 strCopy2 문자열을 복사했습니다.

strcpy_s 함수를 사용해서 두 번째 복사하기 위한 배열 사이즈를 설정합니다.

만약 이 사이즈보다 복사 문자열이 길다면 오류를 출력합니다.

C언어 문자열 함수

출력 결과 strCopy1 문자열이 "strcpy"로 변경되었습니다.

 

 

 

 

더보기
문자열 연결 함수 strcat_s

문자열은 연결하기 위해서는 strcat_s 함수를 사용합니다.

strcat_s 함수를 사용하기 위해서는 문자열을 연결하기 위한 배열이 합산된 길이보다 커야 합니다.

#include <stdio.h>
#include <string.h>
int main(void)
{
	
	char strCat1[40] = "this is ";
	char strCat2[] = " strcat_s";

	strcat_s(strCat1, sizeof(strCat1), strCat2);

	printf(" 복사된 문자열은 \" %s \" 입니다.\n", strCat1);
	printf("\n");

	return 0;
}

strCat1 문자열을 길이를 40으로 고정했습니다.

strcat_s를 사용하면 strCat2 문자열이 strCat1 문자열에 포함됩니다.

C언어 문자열 함수

출력 결과 문자열이 연결된 것을 확인 할 수 있습니다.

strCat1 문자열 길이가 합산된 길이보다 작을 경우 오류를 출력합니다.

 

더보기
문자열 비교 함수 strcmp

문자열을 비교하기 위해서는 strcmp함수를 사용합니다.

strcmp함수는 문자열을 바이트 단위로 비교해서 결과를 리턴합니다.

문자열이 같으면 0을 리턴하고 다르면 0보다 작은 값을 리턴합니다.

#include <stdio.h>
#include <string.h>
int main(void)
{
	
	char strcmp1[] = "strcmp1";
	char strcmp2[] = "strcmp2";
	char strcmp1copy[] = "strcmp1";

	int r1 = strcmp(strcmp1, strcmp2);
	int r2 = strcmp(strcmp1, strcmp1copy);


	printf(" 첫번째 비교 결과는 = %d 입니다.\n", r1);
	printf("\n");
	printf(" 두번째 비교 결과는 = %d 입니다.\n", r2);

	return 0;
}

3개의 문자열을 사용해서 두번 비교했습니다.

C언어 문자열 함수

출력 결과 처음 strcmp1, strcmp2 문자열을 비교하면 -1을 리턴합니다.

두 번째 strcmp1, strcmp1copy 문자열일 비교하면 같은 문자열이기 때문에 0을 리턴합니다.

문자열은 다양한 함수를 사용해서 관리할 수 있기 때문에 반드시 공부해주세요.

이상으로 문자열 함수에 대해서 마치겠습니다.

감사합니다.

반응형
반응형

C언어 스트링

지난 시간에는 C 언어 프로그래밍에 사용하는 배열에 대해서 공부했습니다.

오늘은 스트링을 사용해서 배열에 저장하는 내용을 알아보겠습니다.

문자열을 출력하기 위해서는 printf() 함수를 사용하면 됩니다.

#include <stdio.h>
#include <limits.h>

int main(void)
{
	printf("C언어 스트링입니다.\n");
	printf("\n");
	printf("This is C Language\n");
	printf("\n");

	return 0;
}

출력 결과입니다.

C언어 스트링

printf() 함수를 사용하면 문자열을 바로 출력할 수 있습니다.

이번에는 배열을 사용해서 문자열을 선언하겠습니다.

#include <stdio.h>

int main(void)
{
	
	char stringArray[] = "This is C Language";

	printf("%s\n", stringArray);
	printf("\n");

	return 0;
}

출력 결과입니다.

C언어 스트링

stringArray 배열에 문자열을 선언하게 되면 배열에 순차적으로 문자가 저장됩니다.

C언어 문자열

배열 내부를 확인하면 0 ~ 17 번지까지 문자가 저장됩니다.

정확하게 확인하기 위해서 문자를 한개씩 출력해보겠습니다.

 

 

 

#include <stdio.h>
int main(void)
{
	
	char stringArray[] = "This is C Language";

	int size = sizeof(stringArray);

	for (int i = 0; i < size; i++)
	{
		printf("%d 번지 문자는 = %c 입니다 \n",i, stringArray[i]);
		printf("\n");
	}
	return 0;
}

출력 결과 입니다.

C언어 스트링

sizeof() 함수를 사용해서 문자열 크기를 확인할 수 있습니다.

입력된 문자열을 한 개씩 출력하면 저장된 결과를 확인할 수 있습니다.


문자열은 다중 배열도 사용이 가능합니다.

#include <stdio.h>
int main(void)
{
	
	char stringArray[][20] = {
		"This is C Language",
		"안녕하세요",
		"C언어 문자열입니다."
	};

	int sizey = sizeof(stringArray) / sizeof(stringArray[0]);

	for (int i = 0; i < sizey; i++)
	{
		printf("%d 번지 문자열은 = %s  \n", i, stringArray[i]);
		printf("\n");
	}
	return 0;
}

다중배열은 2차 배열에 저장되는 문자열 크기만 선언합니다.

출력 결과입니다.

C언어 문자열

선언된 문자열 크기가 부합하지 않다면 컴파일 오류가 발생합니다.

문자열(String)은 다양한 방법을 사용해서 저장이 가능합니다.

문자열은 개발에 다양한 코드에 사용하기 때문에 반드시 공부해주세요.

이상 C언어 프로그래밍 문자열에 대해서 알아봤습니다.

감사합니다.

반응형
반응형

오늘은 C언어 프로그래밍에서 연속적인 자료형을 사용하는 방법에 대해서 알아보겠습니다.

C언어에서는 기본적으로 자료형을 사용할 경우 하나씩 선언해야 합니다.

#include <stdio.h>
#include <limits.h>

int main(void)
{

	int class1 = 0;
	int class2 = 1;
	int class3 = 2;
	int class4 = 3;
	int class5 = 4;


	printf("\t class1 = %d입니다.\n", class1);
	printf("\n");
	printf("\t class2 = %d입니다.\n", class2);
	printf("\n");
	printf("\t class3 = %d입니다.\n", class3);
	printf("\n");
	printf("\t class4 = %d입니다.\n", class4);
	printf("\n");
	printf("\t class5 = %d입니다.\n", class5);
	printf("\n");

}

5개의 class 변수를 사용하기 위해서는 5번 자료형을 선언합니다.

출력도 동일하게 5번 함수를 사용해야 합니다.

자료형을 여러번 선언하게 되면 관리하기가 매우 힘들어지고 코드도 복잡하고 길어지게 됩니다.

수정을 할 경우 더욱더 힘들어지겠죠.

이런 문제를 해결하기 위해서 C언어에서는 배열이라는 자료형을 사용합니다.


배열 자료형은 어떤 자료형이라도 선언이 가능합니다.

선언 방법은 매우 간단합니다. 자료형 뒤에 '[개수]'로 정의하면 됩니다.

#include <stdio.h>
#include <limits.h>

int main(void)
{

	int array1[10] = { 1,2,3,4,5,6,7,8,9,10 };

	for (int i = 0; i < 10; i++)
	{
		printf("\t %d 배열은 %d입니다.\n", i+1, array1[i]);
		printf("\n");
	}	
	return 0;
}

int 자료형 10개를 배열로 선언했습니다.

배열로 선언할 경우 초기화를 하기 위해서 선언부 뒤에 개수만큼 초기화해주세요.

초기화 값이 없을 경우는 0으로 초기화됩니다.

for 반복문을 사용해서 10개의 배열을 출력할 수 있습니다.

배열을 사용하면 이렇게 간단하게 코딩을 할 수 있습니다.

 

 

 

배열을 선언하게 되면 순차적으로 자료형 크기만큼 메모리에 연결됩니다.

배열 설정 값을 확인하기 위해서는 0번 주소부터 접근을 해야 합니다.

이유는 배열은 주소 번지로 위치를 찾기 때문에 주소가 앞쪽에 있습니다.

간단하게 자료형 앞쪽 주소부터 확인한다고 생각하시면 됩니다.

그럼 이번에는 배열 주소를 함께 확인해보겠습니다.

#include <stdio.h>
#include <limits.h>

int main(void)
{

	int array1[10] = { 1,2,3,4,5,6,7,8,9,10};

	for (int i = 0; i < 10; i++)
	{
		printf("\t %d 배열 주소는 %p이고 값은 %d입니다.\n", i+1, array1[i], array1[i]);
		printf("\n");
	}	
	return 0;
}

"%p"를 사용해서 주소를 출력할 수 있습니다.

배열 주소가 순차적으로 출력되는 것을 알 수 있습니다.

배열은 다양한 구조로 사용이 가능합니다.


열과행을 별도 선언하게되면  다차원 배열을 생성할 수 있습니다.

#include <stdio.h>
#include <limits.h>

int main(void)
{

	int array1[10][2];

	for (int i = 0; i < 10; i++)
	{
		for (int j = 0; j < 2; j++)
		{
			array1[i][j] = i + (j * 10);
		}
	}



	for (int i = 0; i < 2; i++)
	{
		for (int j = 0; j < 10; j++)
		{
			printf("\t %d",array1[j][i]);
		}
		printf("\n");
	}
	
		
	return 0;
}

자료형 [행][열]로 자료형을 선언하면 배열이 다중 배열로 변경됩니다.

다중배열은 for반복문을 사용해서 초기화해줍니다.

출력도 동일하게 for반복문을 사용합니다.

출력 결과 2행 10열로 정상적으로 출력되었습니다.

대중 배열은 행 개수가 증가하게 되면 계산이 점점 복잡해집니다.

대부분 2중 배열 정도를 많이 사용합니다.

 

 

 


for반복문 초기화가 힘들다면 바로 초기화도 가능합니다.

#include <stdio.h>
#include <limits.h>

int main(void)
{

	int array1[3][3] = {
		{1,2,3},
		{4,5,6},
		{7,8,9} 
	};

	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			printf("\t %d", array1[i][j]);
		}
		printf("\n");
	}		
		
	return 0;
}

바로 초기화하기 위해서는 "{행 초기화}"를 사용해서 한 행씩 초기화하면 됩니다.

출력 결과도 3행 3열로 확인됩니다.

배열은 C언어 프로그래밍에서 매우 중요한 내용입니다.

다양한 배열을 사용해서 프로그래밍해보세요.

감사합니다.

반응형
반응형

오늘은 C언어에서 조건문과 함께 많이 사용되는 반복문에 대해서 알아보겠습니다.

반복문은 참, 거짓을 구분하면서 거짓일 경우 루프를 빠져나가는 형태를 말합니다.

C언어에서는 크게 for, while, do while 3가지가 있습니다.

첫번째 for에 대해서 알아보겠습니다.

for 문은 시작점, 종료점, 증가점 3개의 구문으로 구분됩니다.

시작점은 변수를 선언하고 초기합니다.

종료점은 '참,' '거짓'을 구분합니다.

마지막 증가점은 선언된 변수를 조건에 맞게 증가시킵니다.

 

 

 

fot 시퀀스는 사진 처럼 선언된 조건 식에 부합되지 않을 경우 루프를 빠져나갑니다.

즉 a < 10  조건식은 a가 10보다 클 경우 '거짓'으로 판단되는 겁니다.

#include <stdio.h>
#include <limits.h>

int main(void)
{
	
	for (int a = 0; a < 10; a++)
	{
		printf("\t카운트 = %d\n",a);
		printf("\n");
	}	
}

코드 내용은 0 ~ 9까지 카운트를 출력할 수 있습니다.

출력 결과는 아래와 같습니다.

for 시작점은 0에서 부터 a가 10보다 작은 9까지 확인하고 루프를 빠져나왔습니다.

#include <stdio.h>
#include <limits.h>

int main(void)
{
	
	for (int a = 0; a < 10; a++)
	{
		printf("\t카운트 = %d\n",a);
		for (int b = 0; b < 2; b++)
		{
			printf("\t카운트  친구 = %d\n", b + a);
		}
		printf("\n");
	}	
}

for 문 내부에 다시 for 문을 사용할 수 있습니다.

for 문은 연속으로 사용도 가능하지만 최대한 for 문 내부에서는 한번 정도만 사용해주세요.

for 문을 연속 3번 사용하게되면 연산 속도가 매우 느려지는 것을 확인할 수 있습니다.


두번째는 while문을 알아보겠습니다.

for문은 조건식을 확인하기 위해서 특정 개수 만큼만 동작을 합니다.

하지만, while문은 조건이 거짓일 때 까지 무한 반복합니다.

 

 

 

while문 다음에 오는 조건문이 '거짓'일 경우만 루프를 빠져 나갑니다.

조건문에 부합하지 않을 경우 무한으로 반복하기 때문에 메임 시퀀스에 많이 사용합니다.

처음 카운트 코드를 while문으로 변경해보겠습니다.

#include <stdio.h>
#include <limits.h>

int main(void)
{
	
	int a = 0;
	while (a < 10)
	{
		printf("\t while 카운트 = %d\n", a++);
		printf("\n");
	}

	return 0;
}

for문 보다 조금더 간결하게 코딩을 할 수 있습니다.

출력 결과는 기존과 동일합니다.

#include <stdio.h>
#include <limits.h>

int main(void)
{
	
	int a = 0;
	while (a < 10)
	{
		printf("\t while 카운트 = %d\n", ++a);
		printf("\n");
	}

	return 0;
}

위 코드는 내용은 동일하지만 a증가 "++"을 앞쪽에 사용했습니다.

 

 

 

출력 결과도 0이 아닌 1부터 출력이 됩니다.

여기서 확인해야할 내용은 "++" 증감연산자는 변수 앞에 올경우 변수를 확인 전 증감되어 계산됩니다.

"++" 증감연산자가 변수 뒤에 올 경우는 변수를 사용 후 증감 됩니다.

그래서 처음 출력 값이 0, 1로 변경되는 것을 알 수 있습니다.

"++" 증감 연산자는 중요한 연산자이기 때문에 꼭 기억해주세요.

반복문에서 루프를 그냥 빠져나오기 위해서는 'break'를 사용할 수 있습니다.

#include <stdio.h>
#include <limits.h>

int main(void)
{
	
	int a = 0;
	while (a < 10)
	{
		printf("\t while 카운트 = %d\n", ++a);
		printf("\n");

		if (a == 5)
		{
			printf("\t while 중지 = %d\n", ++a);
			printf("\n");
			break;
		}
	}

	return 0;
}

while문 내부에 if문을 사용해서 5일 경우 빠져나오게 코드를 적용했습니다.

출력 결과는 5다음 중지 했기 때문에 증감 연산자로 증가한 6이 출력되고 중단되는 것을 알수 있습니다.


세번째 do while문에 대해서 알아보겠습니다.

do while문while문을 사용할 경우 바로 빠져나오게 하면 루푸를 확인하지 않는 단점을 보안하기 위해서 사용하는 반복문입니다.

처음 do문 내부에서 로직을 확인하고 while문에서 참, 거짓을 판단합니다.

즉 1번은 무조건 실행되는 반복문입니다.

a변수에 100을 입력하고 다음 while문에서 a를 확인할 경우 거짓으로 판단되어 루프를 빠져 나옵니다.

시퀀스도 do문 실행 이후 while문과 동일하게 동작합니다.

#include <stdio.h>
#include <limits.h>

int main(void)
{
	
	int a = 100;
	do {
		printf("\t do 실행 카운트 = %d\n", a);
		printf("\n");
	} while (a < 10);
	printf("\t do while 종료 = %d\n", a);
	printf("\n");	

	return 0;
}

a 변수를 100으로 초기화 하면 while문에서는 거짓이지만 do문을 먼저 실행합니다.

출력 결과 한번만 출력하고 do while문을 빠져나오는 것을 확인할 수 있습니다.

정상적으로 모두 출력하기 위해서는 아래 코드 처럼해야 합니다.

#include <stdio.h>
#include <limits.h>

int main(void)
{
	
	int a = 0;
	do {
		printf("\t do 실행 카운트 = %d\n", a);
		printf("\n");
		a++;
	} while (a < 10);
	printf("\t do while 종료 = %d\n", a);
	printf("\n");	

	return 0;
}

a 변수를 0으로 초기화 할 경우 참이기 때문에 while문이 정상적으로 동작합니다.

 

 

 

출력 결과 조금 다른 내용을 확이할 수 있습니다.

while문에서는 9까지만 출력되었는데 do while문에서는 10까지 한번 더 출력됩니다.

조건식을 확인 전에 출력하기 때문에 무조건 한번을 더 확인해서 결과 값이 다르게 출력되었습니다.

while문, do while문은 미묘하지만 복잡한 시퀀스를 동작하기 위해서는 반드시 두 특징을 알고 있어야 합니다.

오늘은 C언어 반복문에 대해서 알아봤습니다.

감사합니다.

반응형
반응형

C언어 프로그래밍 2번째 시간에는 자료형에 대해서 배웠습니다.

오늘은 자료형을 사용한 조건문을 알아보겠습니다.

조건문이란 자료형을 사용한 연산자에 참, 거짓을 확인하는 제어 로직입니다.

C언어는 <, <=, ==, !=, >, >= 6가지 기본 연산자를 사용합니다.

모든 기준은 외쪽 피연산자를 기준으로 생각하면 됩니다.

'<' 연산자는 오픈되어 있는 방향으로 큰 값을 의미합니다.

'<' 오른쪽이 큽니까?

'>' 왼쪽이 큽니까?

'<' 기본 연산자를 사용해보겠습니다.

#include <stdio.h>
#include <limits.h>

int main(void)
{
	
	bool 정답 = 0;

	정답 = 9 < 7;

	printf("7은 9보다 큽니까? %d \n", 정답);
	printf("\n");

	return 0;
}

'정답'이란 변수를 bool 자료형을 사용해서 지정합니다.

'9 < 7' 조건문은 9보다 7이 급니까 입니다.

출력 결과 bool 자료형 '정답'에는 0이 지정됩니다.

bool 자료형은 1byte로 0, 1만 사용됩니다.

0은 거짓, 1은 참으로 생각하면 쉽습니다.

 

 

 

출력 결과 7은 9보다 작기 때문에 거짓을 출력합니다.

그럼 전체 조건문을 사용해서 테스트 해보겠습니다.

#include <stdio.h>
#include <limits.h>

int main(void)
{
	
	bool 정답 = 0;

	int 왼쪽 = 9;
	int 오른쪽 = 7;
	
	정답 = 왼쪽 < 오른쪽;
	printf("9 < 7 =  %d \n", 정답 );
	printf("\n");

	정답 = 왼쪽 <= 오른쪽;
	printf("9 <= 7 =  %d \n", 정답);
	printf("\n");

	정답 = 왼쪽 == 오른쪽;
	printf("9 == 7 =  %d \n", 정답);
	printf("\n");

	정답 = 왼쪽 != 오른쪽;
	printf("9 != 7 =  %d \n", 정답);
	printf("\n");

	정답 = 왼쪽 > 오른쪽;
	printf("9 > 7 =  %d \n", 정답);
	printf("\n");

	정답 = 왼쪽 >= 오른쪽;
	printf("9 >= 7 =  %d \n", 정답);
	printf("\n");

	return 0;
}

6가지 연산자를 사용해서 출력했습니다.

결과는 아래와 같습니다.

왼쪽 기준으로 9는 7보다 크기 때문에 거짓 0이 출력되었습니다.

'>' 조건문에서는 왼쪽 피연산자가 큰 것을 의미하기 때문에 참 1이 출력되었습니다.

이처럼 연산자를 다양한 조건을 분리할 수 있습니다.

이번에는 거짓, 참을 구분할 수 있는 제어문을 알아보겠습니다.

' 9 < 7 ' 조건문에서 9가 7보다 클경우와 작을 경우 모두 필요할 경우가 있습니다.

이럴 경우 if, else if, else 제어문을 사용할 수 있습니다.

#include <stdio.h>
#include <limits.h>

int main(void)
{
	
	bool 정답 = 0;

	int 왼쪽 = 9;
	int 오른쪽 = 7;
	
	if ( 왼쪽 < 오른쪽 )
		printf("왼쪽 보다 오른쪽이 큽니다. \n", 정답 );
	else
		printf("왼쪽 보다 오른쪽이 작습니다. \n", 정답);

	printf("\n");

	if (왼쪽 > 오른쪽)
		printf("왼쪽 보다 오른쪽이 큽니다. \n", 정답);
	else
		printf("왼쪽 보다 오른쪽이 작습니다. \n", 정답);

	printf("\n");

	
	return 0;
}

조건문을 '왼쪽 < 오른쪽', '왼쪽 > 오른쪽' 2가지로 실행했습니다.

첫번째 조건문에서는 왼쪽 보다 오른쪽이 작기 때문에 거짓이 적용되어 else 하단에 있는 출력이 실행됩니다.

두번째 조건문에서는 왼쪽 보다 오른쪽이 작기 때문에 참이 적용되어 if 하단에 있는 출력이 실행됩니다.

이처럼 if는 참인 경우 실행됩니다.

else는 거짓일 경우 실행됩니다.

 

 

 

 

if 조건문은 여러개의 연산자를 사용해서 참, 거짓을 판단할 수 있습니다.

#include <stdio.h>
#include <limits.h>

int main(void)
{
	
	bool 정답 = 0;

	int 왼쪽 = 9;
	int 오른쪽 = 7;
	bool 참 = 1;
	bool 거짓 = 0;
	
	if ( (왼쪽 < 오른쪽) && 참 )
		printf("왼쪽 보다 오른쪽이 큽니다. \n", 정답 );
	else
		printf("왼쪽 보다 오른쪽이 작습니다. \n", 정답);

	printf("\n");

	if ( (왼쪽 > 오른쪽) && 거짓 )
		printf("왼쪽 보다 오른쪽이 큽니다. \n", 정답);
	else
		printf("왼쪽 보다 오른쪽이 작습니다. \n", 정답);

	printf("\n");


	if ((왼쪽 < 오른쪽) || 참)
		printf("왼쪽 보다 오른쪽이 큽니다. \n", 정답);
	else
		printf("왼쪽 보다 오른쪽이 작습니다. \n", 정답);

	printf("\n");

	if ((왼쪽 > 오른쪽) || 거짓)
		printf("왼쪽 보다 오른쪽이 큽니다. \n", 정답);
	else
		printf("왼쪽 보다 오른쪽이 작습니다. \n", 정답);

	printf("\n");
	
	return 0;
}

기존 조건문에 '&&', "||' 연산자를 사용해서 연산자를 연결할 수 있습니다.

처음 실행과 다르게 '참' '거짓'을 추가하면 결과가 다르게 출력됩니다.

'&&' 연산자는 AND 연산자로 앞쪽 조건과 AND로 확인 시 모두 1일 경우만 참입니다.

'||' 연산자는 OR 연산자로 앞쪽 조건과 OR로 확인 시 둘 중 하나만 1일 경우 참입니다.

즉 '||' 연산자는 조건문 안에서 한개만 참이면 참으로 실행됩니다.


마지막으로 if문 사용을 최소화 하기 위한 swirch 제어문을 알아보겠습니다.

#include <stdio.h>
#include <limits.h>

int main(void)
{
	
	int 요일을알려줘 = 1;

	switch (요일을알려줘)
	{
	case 1:
		printf("일요일\n");
		break;

	case 2:
		printf("월요일\n");
		break;
	case 3:
		printf("화요일\n");
		break;
	case 4:
		printf("수요일\n");
		break;
	case 5:
		printf("목요일\n");
		break;
	case 6:
		printf("금요일\n");
		break;
	case 7:
		printf("토요일\n");
		break;
	default:
		printf("1 ~ 7까지만 알아요 ㅠㅠ\n");
		break;
	}	
	return 0;
}

switch문은 case, dafault로 분기됩니다.

즉 swirch에서 case에 부합될 경우만 출력을 실행하고, 아닐 경우 dafault 내용을 실행합니다.

'요일을알려줘'에 1이 적용되었기 때문에 출력은 아래와 같습니다.

swirch문에 부합되는 case일 경우만 출력을 실행합니다.

이처럼 다양한 자료형 과 연산자를 사용해서 기본적인 제어 구조 프로그래밍을 적용할 수 있겠습니다.

C언어 조건문에 대해서 마치겠습니다.

감사합니다.

반응형
반응형

C 언어 프로그램밍 2번째 시간에는 자료형에대해서 알아보겠습니다.

컴퓨터는 메모리라는 공간을 사용해서 정보를 저장합니다.

이런 메모리 공간을 우리는 0,1로 구분할 수 있는 한개의 박스라고 생각할 수 있습니다.

즉 한개 박스안에 0 또는 1만 존재할 수 있는 겁니다.

이런 박스가 컴퓨터 내부에 엄청나게 많이 존재하는 겁니다.

이런 박스가 천개 있으면 킬로바이트(kliobytes)라고 합니다.

킬로바이트가 1024개 있으면 메가바이트(megabytes)라고 합니다.

다시 메가바이트가 1024개 있으면 기가바이트(gigabytes)라고 합니다.

우리가 모두 알고 있는 테라바이트(terabytes)는 기가바이트가 1024개 있어야 합니다.

 

이처럼 프로그래밍은 이러한 메모리를 사용해서 컴파일하고 EXE 실행파일을 생성합니다.

위표는 8bit 메모리를 사용하는 byte 메모리 표입니다.

1비트 기준을 0,1로 사용여부를 결정하고 1bit마다 2의승수가 적용되어 계산됩니다.

C언어는 이러한 바이트 집합을 자료형이라고 합니다.

이 자료형은 요즘같은 메모리가 많은 시대에서는 중요하지는 않지만 코드 상에서 정확한 계산을 하기 위해서는 반드시 필요한 내용입니다.

그럼 이런 자료형은 어떻게 C언어에서 사용하지 알아 보겠습니다.

#include <stdio.h>

int main(void)
{
	int 시급 = 1000;
	int 일한시간 = 7;
	int 월급 = 시급 * 일한시간;
	printf(" 오늘 월급은 %d 입니다. \n", 월급);
	printf("\n");
	return 0;
}

이해하기 쉽도록 변수를 한글을 사용했습니다.

변수를 한글로 사용해도 컴파일에는 아무 상관없습니다.

이유는 위에서 말씀드린것 처럼 컴퓨터는 박스에 0 , 1만 확인하기 때문에 문법만 맞다면은 문제가 안됩니다.

위내용 처럼 int 자료형을 선언하고 뒤에 문자열을 입력하면 4바이트를 사용하는 문자열로 인식하는 겁니다.

생성된 문자열 "시급"에 = 부호를 사용해서 1000 이라는 값을 입력했습니다.

int 자료형은 -2147489648 ~ 2147489647까지 포함하기 때문에 사용하는데 아무 문제가 없습니다.

그럼 C언어 프로그램은 "시급" 변수 bit트 배열을 1000으로 변경합니다.

"일한시간"도 동일하게 할당 됩니다.

단 한글로 사용할 경우는 영문과 동일하게 스페이스(간격)이 들어가면 안됩니다.

 

 

 

이렇게 입력된 내용은 "%d"를 사용해서 printf에서 출력할 수 있습니다.

출력 내용은 "시급"  *  "일한시간"이니까 7000을 확인 할 수 있습니다.

자료형은 다양하게 선언해서 사용이 가능합니다.

#include <stdio.h>

int main(void)
{
	int 인트 = 1000;
	char 문자열 = 'a';
	float 소수점 = 1.2;
	printf(" 인트 4바이트 = %d \n", 인트);
	printf("\n");
	printf(" 문자열 1바이트 = %c \n", 문자열);
	printf("\n");
	printf(" 소수점 4바이트 = %f \n", 소수점);
	printf("\n");
	return 0;
}

각 자료형에 입력 내용을 넣고 printf() 함수를 사용해서 출력했습니다.

printf() 함수는 ""가 끝나는 지점에 %d를 사용한 개수 만큼 ','를 사용해서 변수를 정의할 수 있습니다.

컴파일 출력 결과는 다음과 같습니다.

설정한 자료형에 따라서 출력 내용이 상이합니다.

자료형 범위안에 포함만 된다면 모든 자료형을 조합할 수 있습니다.

하지만 기본적으로 프로그래밍을 할 때는 가독성과 메모리를 유연하게 사용하기 위해서 같은 자료형 끼리 사용합니다.

즉 int, float는 같은 4바이트 정수와 소수점을 구분해서 사용하는 것이 좋은 방법입니다.

#include <stdio.h>

int main(void)
{
	int 인트 = 1.2;
	char 문자열 = 'a';
	float 소수점 = 1000;
	printf(" 인트 4바이트 = %d \n", 인트);
	printf("\n");
	printf(" 문자열 1바이트 = %c \n", 문자열);
	printf("\n");
	printf(" 소수점 4바이트 = %f \n", 소수점);
	printf("\n");
	return 0;
}

위 코드는 "인트", "소수점"을 반대로 사용했습니다.

그럼 출력은 어떻게 될까요

이 처럼 원하는 값을 얻지 못했습니다.

"인트"에 소수점을 넣으면 인트형태로 인식하기 때문에 소수점을 확인할 수 없습니다.

 

 

 

자료형은 +, -, *, /, %를 사용해서 연산할 수 있습니다.

출력에 사용하는 필수 스트링은 아래와 같습니다.

정확한 자료형 크기는 limits.h에 정의되어 있습니다.

limits.h에 자료형 크기가 #define 되어 있습니다.

 

#include <stdio.h>
#include <limits.h>

int main(void)
{
	printf("char 자료형 크기는 = %d to %d\n", CHAR_MIN, CHAR_MAX);
	printf("\n");
	printf("unsigned char 자료형 크기는 = 0 to %u\n", UCHAR_MAX);
	printf("\n");
	printf("short 자료형 크기는 = %d to %d\n", SHRT_MIN, SHRT_MAX);
	printf("\n");
	printf("unsigned short 자료형 크기는 = 0 to %u\n", USHRT_MAX);
	printf("\n");
	printf("int  자료형 크기는 = %d to %d\n", INT_MIN, INT_MAX);
	printf("\n");
	printf("unsigned int 자료형 크기는 = 0 to %u\n", UINT_MAX);
	printf("\n");
	printf("long 자료형 크기는 = %ld to %ld\n", LONG_MIN, LONG_MAX);
	printf("\n");
	printf("unsigned long 자료형 크기는 = 0 to %lu\n", ULONG_MAX);
	printf("\n");
	printf("long long 자료형 크기는 = %lld to %lld\n", LLONG_MIN, LLONG_MAX);
	printf("\n");
	printf("unsigned long long 자료형 크기는 = 0 to %llu\n", ULLONG_MAX);
	printf("\n");
	printf("double  자료형 크기는 =  %u \n", DBL_DIG);
	printf("\n");
	printf("long double  자료형 크기는 =%u \n",	LDBL_DIG);
	printf("\n");
	return 0;
}

Printf() 함수를 사용해서 자료형 크기를 출력하겠습니다.

마지막으로 sizeof() 함수를 사용해서 자료형이 차지하는 byte 크기를 알아보겠습니다.

#include <stdio.h>
#include <limits.h>

int main(void)
{
	printf("char 크기= %u bytes\n", sizeof(char));
	printf("\n");
	printf("short 크기= %u bytes\n", sizeof(short));
	printf("\n");
	printf("int 크기= %u bytes\n", sizeof(int));
	printf("\n");
	printf("long 크기= %u bytes\n", sizeof(long));
	printf("\n");
	printf("long long 크기= %u bytes\n", sizeof(long long));
	printf("\n");
	printf("float 크기= %u bytes\n", sizeof(float));
	printf("\n");
	printf("double 크기= %u bytes\n", sizeof(double));
	printf("\n");
	printf("long double 크기= %u bytes\n", sizeof(long double));
	printf("\n");
	return 0;
}

sizeof() 함수는 자료형 크기를 확인할 수 있습니다.

출력 결과 각 자료형이 차지하는 byte크기를 확인할 수 있습니다.

sizeof()는 통신과 같은 사이즈를 확인해야하는 코드에 많이 사용합니다.

오늘은 C언어 프로그래밍 자료형에 대해서 알아봤습니다.

이번 내용을 확인하고 다양한 연산 프로그램을 공부해보세요.

감사합니다.

반응형
반응형

오늘 부터 오랜 시간동안 일하던 내용을 정리하면서

공부도 할 겸 C언어 프로그래밍을 정리해보겠습니다.

C언어는 다양한 디바이스에서 사용할 수 있는 조금 복잡한 언어이지만

모든 언어의 기본이기 때문에 한번 쯤 공부하는 것을 추천합니다.

C언어에 설치 및 컴파일에 대해서는 많은 블로그가 있으니 참고해주시고요. 

바로 프로그래밍으로 들어가겠습니다.

C언어는 기본적으로 Main이란 함수에서 부터 시작합니다.

#include <stdio.h>
int main(void)
{
	return 0;
}

상단에는 #include를 사용해서 .h 파일을 선택해야 합니다.

기본적으로 stdio.h를 포함하고 처음 컴파일을 진행하면 됩니다.

이제 main 함수 내부에서 가장 기본인 출력을 해보겠습니다.

컴파일 내용을 확이하기 위해서는 꼭 필요한 내용입니다.

출력을 하기 위해서는 printf() 함수를 사용합니다.

#include <stdio.h>

int main(void)
{
	printf("Hello world^^\n");	
	return 0;
}

printf() 함수를 사용해서 "Hello world"를 출력해보겠습니다.

전 컴파일을 하기 위해서 Visual Studio 2019 무료 버전을 사용합니다.

Visual Studio 2019는 기본적으로 C언을 포함하고 있어 설정 필요 없이 바로 컴파일 됩니다.

Control + F5를 눌러주면 컴파일을 진행합니다.

결과는 cmd 창에 "Hello world"를 확인 할 수 있습니다.

조금 더 출력을 해보겠습니다.

 

 

 

#include <stdio.h>

int main(void)
{
	printf("Hello world^^\n");
	printf("\n");
	printf("\"C언어 프로그램을 시작합니다 모두 화이팅^^\"\n");
	printf("\n");
	printf("다양한 방법으로 C언를 출력할 수 있습니다.");
	printf("\n");
	return 0;
}

printf 함수를 사용하면 다양한 문장을 출력할 수 있어 컴파일 실행 시 가독성을 높일 수 있습니다.

다시 복습해보겠습니다. C언어는 main 함수 시작 점에서 내부 코드를 실행하고 함수를 종료하는 구조입니다.

가장 기본적인 구조이기 때문에 반드시 숙지하셔야 합니다.

main 함수 외부에 코드를 넣으면 컴파일 오류가 발생합니다.

printf() 함수는 특수 문자열은 바로 출력할 수 없는 단점이 있습니다.

무슨 말이냐면 컴파일에 필요한 특수 문자는 바로 출력이 불가능합니다.

출력하기 하기 위해서는 이스케이프 시퀀스(Escape Sequence)를 사용해야 합니다.

 

 

 

이스케이프 시퀀스(Escape Sequence)를 사용해서 print() 함수를 출력 했습니다.

#include <stdio.h>

int main(void)
{
	printf("줄바꿈 \n");
	printf("\n");
	printf("캐리지리턴 \r \n");
	printf("\n");
	printf("백스페이스\b백스페이스 \n");
	printf("\n");
	printf("폼피드\f 폼피드 \n");
	printf("\n");
	printf("수평탭 \t 수평탭 \n");
	printf("\n");
	printf("수직탭 \v 수직탭 \n");
	printf("\n");
	printf("비프음 \a \n");	
	printf("\n");
	printf("문자열 \?출력 \n");
	printf("\n");
	printf("문자열 \"출력 \n");
	printf("\n");
	printf("문자열 \'출력 \n");
	printf("\n");
	printf("문자열 \\출력 \n");
	printf("\n");
	return 0;
}

컴파일 결과는 아래와 같습니다.

이처럼 이스케이프 시퀀스를 사용하면 다양한 출력을 할 수 있습니다.

printf 함수를 사용해서 다양한 출력 프로그램밍을 시작해보세요.

오늘은 C언어 main 함수와 출력에 대해서 알아봤습니다.

다음 시간에 뵙겠습니다.

감사합니다.

반응형
반응형

ZTE에서 신규 제품이 나왔습니다.
가격은 430$ ~ 600$ 정도입니다.
그런데 사양이 장난 아니네요.
중국에서 화웨이 다음 회사라고 합니다.

zte-nubia-z11-1

zte-nubia-z11-2

 

zte-nubia-z11-3

NETWORK
Technology
GSM / CDMA / HSPA / LTE

2G bands
GSM 850 / 900 / 1800 / 1900 - SIM 1 & SIM 2

CDMA 800

3G bands
HSDPA 850 / 900 / 1900 / 2100

TD-SCDMA

4G bands
LTE band 1(2100), 3(1800), 7(2600), 38(2600), 39(1900), 40(2300), 41(2500)

Speed
HSPA, LTE

GPRS
Yes

EDGE
Yes

LAUNCH
Announced
2016, June

Status
Available. Released 2016, July

BODY
Dimensions
151.8 x 72.3 x 7.5 mm (5.98 x 2.85 x 0.30 in)

Weight
162 g (5.71 oz)

SIM
Dual SIM (Nano-SIM, dual stand-by)

DISPLAY
Type
IPS LCD capacitive touchscreen, 16M colors

Size
5.5 inches (~75.2% screen-to-body ratio)

Resolution
1080 x 1920 pixels (~403 ppi pixel density)

Multitouch
Yes

Protection
Corning Gorilla Glass 3

- nubia UI 4.0

PLATFORM
OS
Android OS, v6.0.1 (Marshmallow)

Chipset
Qualcomm MSM8996 Snapdragon 820

CPU
Dual-core 2.15 GHz Kryo & dual-core 1.6 GHz Kryo

GPU
Adreno 530

MEMORY
Card slot
microSD, up to 256 GB (uses SIM 2 slot)

Internal
64 GB, 4 GB RAM or 128 GB, 6 GB RAM

CAMERA
Primary
16 MP, f/2.0, phase detection autofocus, OIS, dual-LED (dual tone) flash

Features
1/2.8" sensor size, 1.12 µm pixel size, geo-tagging, touch focus, face/smile detection, panorama, HDR

Video
2160p@30fps

Secondary
8 MP, f/2.4, 1.4 µm pixel size, 1080p

SOUND
Alert types
Vibration; MP3, WAV ringtones

Loudspeaker
Yes

3.5mm jack
Yes

- Dolby Atmos
- 24-bit/192kHz audio
- Active noise cancellation with dedicated mic

COMMS
WLAN
Wi-Fi 802.11 a/b/g/n/ac, dual-band, Wi-Fi Direct, DLNA, hotspot

Bluetooth
v4.1, A2DP, LE

GPS
Yes, with A-GPS, GLONASS

NFC
Yes

Infrared port
Yes

Radio
To be confirmed

USB
Type-C 1.0 reversible connector, USB On-The-Go

FEATURES
Sensors
Fingerprint, accelerometer, gyro, proximity, compass

Messaging
SMS(threaded view), MMS, Email, Push Email, IM

Browser
HTML5

Java
No

- Fast battery charging: 83% in 30 min (Quick Charge 3.0)
- MP4/H.264 player
- MP3/WAV/FLAC/eAAC+ player
- Photo/video editor
- Document viewer

BATTERY
Non-removable Li-Ion 3000 mAh battery

MISC
Colors
Silver, Gray, Gold, Rose Gold

반응형

+ Recent posts