반응형
반응형

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언어 프로그래밍 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언어 조건문에 대해서 마치겠습니다.

감사합니다.

반응형

+ Recent posts