본문 바로가기

컴퓨터/언어,프로그래밍

문자열 연산자 - strcpy, strncpy, strlen, strcat, strncat, strcmp, strncmp, strchar, strstr, atoi, atof, atol, strftime

 

strcpy

이 함수는 특정 문자열에서 NULL 문자를 인식할때까지의 모든 데이터를 다른 곳으로 복사한다.

char * strcpy(char * strDestination, const char * strSource);

// NULL 문자를 만나기 전까지 strSource에서 strDestination로 복사한다.


ex>

char string[5] = {0};

strcpy(string, "1234567890"); 

//컴파일은 정상으로 되나 실재 사용에서 에러가 날수있다. 
그 이유는 overflow가 일어나기 때문으로 복사시 해당배열을 넘어도 메모리상의 배열과 붙어있는 영역에 복사를 한다. 
이때 다른영역을 건드리기때문에 그 영역을 사용하지 않는다면 문제가 일어나지 않겠지만 그영역을 사용한다면 에러를 발생시킨다.


strcpy(string, "12345"); 

//이것또한 위와 같은 에러를 발생시키는데 이는 마지막에 NULL까지 복사를 진행하기때문에 overflow가 발생한다.

strcpy(string, "1234");

//1234와 NULL를 복사한다.

 

strncpy

strcpy와 동일하지만 복사할 문자열의 개수를 설정할 수 있다는 것이 다르다.

char * strncpy(char * strDestination, const char * strSource, size_t count);

// count만큼 strSource에서 strDestination로 복사한다.
또한 count보다 문자열이 작다면 NULL 문자를 만나기 전까지만 복사한다.

ex>

char string[5] = {0};

strncpy(string, "1234567890", 5);

//12345까지 복사가 이루어진다. 하지만 이것도 에러가 발생할 수 있다.
strncpy는 복사를 완료한 후 배열의 끝에 NULL값을 직접 넣어줘야 한다.
그렇지 않으면 출력시 12345를 출력하고 NULL을 만날때까지 이상한 문자가 출력될 것이다.

strncpy(string, "1234567890", 6);

//123456까지 복사가 이루어진다.
이것 또한 에러를 발생시키는데, 실재 배열보다 많은 문자를 복사함으로 생기는 overflow가 발생하기 때문이다.

strncpy(string, "12", 5);

//12까지 복사가 이루어지고 나머지는 NULL로 채워진다.

strncpy(string, "1234567890", 4);

string[4] = '\0';

//1234까지 복사가 이루어지고 마지막를 NULL로 채운다.

 

strlen

현재 문자열의 크기를 알고 싶은 경우 사용하는 함수로 문자열의 크기는 NULL문자까지의 문자 데이터의 수를 의미한다.

size_t strlen(const char * string);

// string의 크기를 리턴한다. 이때 NULL을 뺀 \r\n도 문자로 인식하여 리턴한다.


strcat

다른 문자열을 합치는 기능을 하는 함수이다.

char * strcat(char * strDestination, const char * strSource);

// strDestination의 뒤에 strSource를 복사한다.

ex>

char string[10] = "Help";

strcat(string, "1234567890");

//Help에 1234567890까지 복사가 이루어진다. 하지만 이것도 에러가 발생할 수 있다.
실재 배열보다 많은 문자를 복사함으로 생기는 overflow가 발생하기 때문이다.

strcat(string, "12");

//Help에 12와 마지막 NULL까지 복사한다.


strncat

strcat와 동일하지만 합칠 문자열의 개수를 설정할 수 있다는 것이 다르다.

char * strncat(char * strDestination, const char * strSource, size_t count);

// count만큼 strDestination의 뒤에 strSource를 복사한다.

ex>

char string[10] = "Help";

strncat(string, "1234567890", 5);

//Help에 12345까지 복사가 이루어진다. 하지만 이것도 에러가 발생할 수 있다.
strncpy와 같이 복사를 완료한 후 배열의 끝에 NULL값을 직접 넣어줘야 한다.
그렇지 않으면 출력시 Help12345를 출력하고 NULL을 만날때까지 이상한 문자가 출력될 것이다.

strncat(string, "1234567890", 10);

//Help에 1234567890까지 복사가 이루어진다.
이것 또한 에러를 발생시키는데, 실재 배열보다 많은 문자를 복사함으로 생기는 overflow가 발생하기 때문이다.

strncat(string, "12", 5);

//Help에 12와 NULL까지 복사가 이루어진다.

strncat(string, "1234567890", 5);

//Help에 12345까지 복사가 이루어지고 마지막를 NULL로 채운다.

 

strcmp

두 개의 문자열을 비교하여 서로 같은지를 나타내는 기능을 한다.

int strcmp(const char * string1, const char * string2);

// string1과 string2의 차이에 따라 리턴하는 정수의 값이 틀리다.

보다 작으면

string1 < string2

보다 크면

string1 > string2

이면

string1 = string2


ex>

strcmp("ab", "ab");  //0를 리턴한다.

strcmp("ab", "ac");  //-1를 리턴한다.

strcmp("ab", "abc");  //-1를 리턴한다.

strcmp("ac", "ab");  //1를 리턴한다.

strcmp("abc", "ab");  //1를 리턴한다.

 

strncmp

strcmp와 동일하지만 비교할 문자열의 개수를 설정할 수 있다는 것이 다르다.

int strncmp(const char * string1, const char * string2, size_t count);

// count만큼 비교하여 string1과 string2의 차이에 따라 리턴하는 정수의 값이 틀리다.

ex>

strncmp("ab", "ab", 3);  //0를 리턴한다.

strncmp("abcd", "abcf", 3);  //0를 리턴한다.

strncmp("ab", "ac", 3);  //-1를 리턴한다.

strncmp("abc", "abf", 3);  //-1를 리턴한다.

strncmp("ac", "ab", 3);  //1를 리턴한다.

strncmp("abf", "abc", 3);  //1를 리턴한다.


strchar

문자열 안에 특정 문자가 존재하는지 여부를 체크하는 함수이다.

char * strchr(const char * string, int c);

ex>

char string[100] = "1234567890";

strchr(string, '8');

// string에서 '8'을 검색해 해당 문자 위치를 포인터로 리턴한다.


strstr

문자열 안에 특정 문자열이 존재하는지 여부를 체크하는 함수 이다.

char * strstr(const char * string, const char * strCharSet);

ex>

char string1[100] = "1234567890";

char string2[] = "890";

strstr(string1, "123");

strstr(string1, string2);

// string에서 strCharSet을 검색해 해당 문자열 위치를 포인터로 리턴한다.


atoi

문자열을 정수형인 int 타입으로 변환하는 함수이다.

int atoi(const char * string);

ex>

char string[] = "12345";

atoi(string);  //정수 12345를 리턴한다.

atoi("-12345");  //정수 -12345를 리턴한다.

atoi("123.45");  //정수 123를 리턴한다.

atoi("123ab");  //정수 123를 리턴한다.

_itoa

정수형을 문자열인
char 타입으로 변환하는 함수이다.

char *_itoa( int value, char *string, int radix );

ex>

char buffer[20];
_itoa( i, buffer, 10 );
// i : 문자로 변경하고자 하는 숫자가 들어있는 변수
// buffer : 숫자를 문자로 변경할때 문자가 들어가는 변수
// 10 : 숫자를 어떤 진수 형태로 문자로 변경할것인가를 정의 해주는 값
// 10=> 10진수, 16=> 16진수....


atof

atoi와 비슷하지만 부동소수점을 리턴하는 것이 다르다.

double atof(const char * string);

ex>

char string[] = "123.45";

atof(string);  //소수 123.45를 리턴한다.

atof("-123.45");  //소수 -123.45를 리턴한다.

atof("123");  //소수 123.00를 리턴한다.

atof("123ab");  //소수 123.00를 리턴한다.

 

atol

atoi와 비슷하지만 long타입형을 리턴하는 것이 다르다.

long
atol(const char * string);


strtime

이 함수는 사용자가 지정한 형식대로 현재시간을 문자열로 출력하는 함수이다.

size_t strtime(char * strDest, size_t maxsize, const char * format, const struct tm * timeptr);

형식

설명

결과

예제

a

요일, day of week

세 문자 영어 약어

Sun

A

요일, day of week

영어 전체 이름

Sunday

b

, month

세 문자 영어 약어

Dec

B

, month

영어 전체 이름

December

c

날짜/시간

두 자리씩//년 시//

12년 9월 6일 23시 58

d

, day

두 자리(01 - 31)

10

H

, hour

24시간 형식의 두 자리(00 - 23)

0

I

, hour

12시간 형식의 두 자리(01 - 12)

12

j

일수, day of year

세 자리(001 - 366)

344

m

, month

두 자리(01 - 12)

12

M

, minute

두 자리(00 - 59)

39

p

, hour

두 문자, AM 또는 PM

AM

S

, second

두 자리(00 - 59)

50

U

, week of year

두 자리(00 - 53)

50

w

요일, day of week

한 자리(0 - 6)

0

W

, week of year

두 자리(00 - 53)

49

x

날짜, date

두 자리씩//

2012년 10월 6

X

시간, time

두 자리씩//

0시 42분 40

y

, year

두 자리(00 - 99)

6

Y

, year

네 자리(0000 - 9999)

2006

z, Z

시간대, time zone

레지스트리 정의 사용

대한민국 표준시

%

%, percent

한 문자, % 기호

%

ex>
time_t cur;
struct tm* ptm;
char buf[100] = {0};

cur = time(NULL);
ptm = localtime(&cur);
//현재 시간을 얻어온다.


strftime(buf, sizeof(buf), "%c", ptm);
//12/10/06 15:30:05
strftime(buf, sizeof(buf), "%m/%d/%y %H:%M:%S", ptm);
//12/10/06 15:30:05
strftime(buf, sizeof(buf), "%Y년 %#m월 %#d일 %#I시 %#M분 %#S초", ptm);
//2006년 12월 10일 3시 30분 5초
strftime(buf, sizeof(buf), "%I:%M %p", ptm);
//03:30 PM

// 위 함수를 사용하기 위해서는 localtime(...); 함수로 시간을 우선 얻어와야 한다.


참고 : 위의 strtime함수 사용시 include <time.h>을 추가해야 한다.
strtime함수를 제외한 함수들을 사용시 include <iostream>을 추가해야 한다.


제주삼다수, 2L,... 오뚜기 진라면 매운... 상하목장 유기농 흰... 남양 프렌치카페 카... 고려인삼유통 홍삼 ... 종근당건강 오메가3... 요이치 카링 유무선...