Developer

19.(C언어) 문자열 함수 본문

Programming Language/C

19.(C언어) 문자열 함수

DPhater 2020. 8. 1. 21:46

C에서 제공하는 문자열 함수를 알아보자

문자열 길이

길이는 sizeof를 쓰면 되지 않나? 라고 생각할 수 있지만 만약 10크기의 배열에

"abc"문자열이 들어가 있다고 생각해보자! 실제 문자열 길이는 NULL문자를 제외하고 3이다. 하지만 sizeof연산자를 사용하면 배열의 크기인 10이 나올것이다.  따라서 문자열의 길이를 구해주는 함수가 따로 존재한다.

 

사용 방법: strlen(문자열포인터);

#include<stdio.h>
#include<string.h>
int main(){
	char s[10]="Study";	
	printf("%d\n",strlen(s));
	return 0;
}

코드1 실행 결과

strlen(string length)함수는 string.h 헤더파일에 선언되어 있으므로 string.h를 포함해줘야 한다. 코드1에서 알 수 있듯이 strlen은 NULL을 제외한 문자열의 크기를 반환한다.

문자열 복사하기

미리 선언된 배열에는 문자열을 요소별로 하나씩 직접 입력해 주야야 한다고 했다.

하지만 strcpy를 사용하면 배열이나 포인터로 문자열을 복사할 수 있다.

 

사용 방법: strcpy(목적지, 원본 문자열);

-목적지에 원본 문자열을 복사한다.

#include<stdio.h>
#include<string.h>
int main(){
	char s[10]="Study";	
	char s1[10];
	
	strcpy(s1,s);
	printf("%s\n",s1);
	return 0;
}

코드2 실행 결과

strcpy(string copy)함수는 string.h 헤더파일에 선언되어 있으므로 string.h를 포함해줘야 한다. 코드2에서 알 수 있듯이 strcpy는 원본 문자열을 목적지로 복사해준다. visual studio 에서는 컴파일 에러가 발생할텐데 strcpy함수는 문자열의 길이를 확인하지 않고 복사를 수행해 안전하지 않기 때문이다. #define _CRT_SECURE_NO_WARNINGS를 추가하자

문자열 붙이기

strcat함수를 사용하면 문자열을 연결시킬 수 있다.

 

사용방법: strcat(붙여질 문자열, 붙일 문자열);

-붙여질 문자열 뒤에 붙일 문자열을 추가한다.

#include<stdio.h>
#include<string.h>
int main(){
	char s[10]="Study";	
	char s1[10]="Hard";
	
	strcat(s,s1);
	printf("%s\n",s);
	return 0;
}

코드3 실행 결과

strcat(string concatenate)함수는 string.h 헤더파일에 선언되어 있으므로 string.h를 포함해줘야 한다. 코드3에서 s에 s1을 붙인 뒤 출력하였다. strcat역시 크기를 확인하지 않고 수행해 안전하지 않다.

문자열 비교하기

두 문자열을 비교하기 위해 strcmp함수를 사용할 수 있다.

 

사용방법: strcmp(문자열1,문자열2);

-문자열1이 클 경우 1

-문자열이 같을 경우 0

-문자열2가 클 경우 -1

문자열의 크기는 ASCII코드 기준으로 대 소를 구분한다.

#include<stdio.h>
#include<string.h>
int main(){
	char s[10]="abc";	
	char s1[10]="abd";
	printf("%d\n",strcmp(s,s1));
	return 0;
}

코드4 실행 결과

strcmp(string compare)함수는 string.h 헤더파일에 선언되어 있으므로 string.h를 포함해줘야 한다. 코드4에서 s와 s1을 비교하였고 s가 s1보다 작기 때문에 -1이 출력되었다. 사전순으로 생각했을 때 작을수록 사전의 앞에 위치하는 것이다. 리눅스와 OS X의 경우 ASCII코드 값의 차이를 반환한다.

문자열 검색하기

문자열안에 특정 문자가 있는지 검색할 수 있고, 특정 문자열이 있는지 검색할 수 있다. 문자열에서 특정 문자가 있는지 검색하는 함수는 strchr함수 이고, 특정 문자열을 검색하는 함수는 strstr함수이다. strchr함수부터 알아보자.

 

사용법: strchr(문자열,검색할 문자);

-검색 문자가 있다면 해당 문자로 시작하는 문자열의 포인터를 반환하고, 없다면 NULL을 반환한다.

#include<stdio.h>
#include<string.h>
int main(){
	char s[20]="Review is important";
	char *sptr=strchr(s,'i');
	while(sptr!=NULL){
		printf("%s\n",sptr);
		sptr=strchr(sptr+1,'i');
	}
	return 0;
}

코드5 실행 결과

 

char *sptr=strchr(s,'i'); 실행 후

처음 strchr을 사용해 'i'를 찾으면 sptr포인터는 위의 그림처럼 s[3]을 가리키고 있다. while문을 통해 만약 i를 찾았다면 해당 i부터 문자열을 출력하고 다음 i를 찾기위해 sptr+1 부터 i를 찾는것이다.

sptr=strchr(sptr+1,'i'); 실행 후

strchr(string character)함수는 string.h 헤더파일에 선언되어 있으므로 string.h를 포함해줘야 한다.

이제 특정 문자열이 있는지 확인해 보자

특정 문자열 검색은 strstr함수를 이용해 할 수 있다.

 

사용법: strstr(문자열,검색할 문자열);

-검색할 문자열을 찾았다면 찾은 문자열의 가장 처음 포인터를 반환, 문자열이 없다면 NULL반환

#include<stdio.h>
#include<string.h>
int main(){
	char s[20]="Review is important";
	char *sptr=strstr(s,"is");
	while(sptr!=NULL){
		printf("%s\n",sptr);
		sptr=strstr(sptr+1,"is");
	}
	return 0;
}

코드6 실행 결과

strstr(string string)함수는 string.h 헤더파일에 선언되어 있으므로 string.h를 포함해줘야 한다. 사용법은 strchr과 거의 유사하며 주의할 점은 검색할 문자열로 시작하는 문자열의 포인터를 반환한다는 것이다.

문자열 자르기(Tokenize)

strtok 함수를 사용해 특정 문자를 기준으로 문자열을 나눌 수 있다.

 

사용법: strtok(문자열,기준문자);

-자른 문자열을 반환하고 더 자를게 없으면 NULL반환

#include<stdio.h>
#include<string.h>
int main(){
	char s[20]="Review is important";
	char *sptr=strtok(s," ");
	while(sptr!=NULL){
		printf("%s\n",sptr);
		sptr=strtok(NULL," ");
	}
	return 0;
}

코드7 실행 결과

strtok(string tokenize)함수string.h 헤더파일에 선언되어 있으므로 string.h를 포함해줘야 한다. strtok는 기준 문자를 만나면 해당 문자를 NULL문자로 바꾼다. 그런데 코드7을 보면 while문 내부에 있는 strtor의 첫 번째 인자로 NULL을 주는것을 확인할 수 있다. NULL을 입력해준 이유는 strtok 함수의 구조와 연관이 있다. strtok함수는 자체적으로 이전에 검색한 위치를 static로 보관하고 있고, 첫 번째 인자로 NULL이 들어온다면 이전에 자른위치 다음부터 다시 strtok를 수행한다.

문자열을 정수로 정수를 문자열로 바꾸기

"123"과 123이 다른다는 것을 우리는 알고있다. 그럼 "123"을 정수 123으로

정수123을 문자열"123"으로 바꿀 수 있을까?

atoi와 sprintf를 사용해 할 바꿀 수 있다.

 

atoi 사용법 : atoi(문자열);

-성공하면 바뀐 정수를 반환

sprintf 사용법: sprintf(문자열,"%d",정수);

#include<stdio.h>
#include<stdlib.h>
int main(){
	char s[10]="123",s1[10];
	int a,a1=123;
	a=atoi(s);  //문자열을 정수로 
	sprintf(s1,"%d",a1); //정수를 문자열로
	printf("%d  %d\n",a,s1);
	printf("%s",s1);
	return 0;
}

코드8 실행 결과

atoi함수는 stdlib.h 헤더에 선언되어 있으므로 stdlib.h헤더를 포함해야한다.

sprintf는 stdio.h헤더에 선언되어 있다.

아무 값도 저장되어있지 않은 int형 변수 a 에 문자열 s를 정수로 변환해 저장했다.

또한 선언만 되어있고 아무값도 들어있지 않은 문자열 s1에 정수 123을 문자열로 변환해 저장했다.

sprintf

printf함수는 화면에 출력해 주었지만 sprintf는 원하는 서식을 지정해 문자열을 만들 수 있다. printf와 유사하지만 문자열을 저장할 배열인자가 하나 더 들어간다.

 

사용법 : sprintf(배열,서식,값...);

서식과 값 부분은 printf함수와 똑같다. 다른점은 화면에 출력하는게 아니라 배열에 문자열을 저장하는 것이다.

#include<stdio.h>
int main(){
	char s[100],s1[]="love"; 
	sprintf(s,"I %s You","hate");
	printf("%s\n",s);
	sprintf(s,"I %s You",s1);
	printf("%s\n",s);
	return 0;
}

코드9 실행 결과

printf는 표준 출력에 원하는 문자열을 출력해주는 것이고, sprintf는 char 형 배열에 원하는 문자열을 저장해 주는것이라고 생각하면된다. 서식지정자 사용도 printf와 똑같다.

'Programming Language > C' 카테고리의 다른 글

21.(C언어) 구조체(2)  (0) 2020.08.01
20.(C언어) 구조체(1)  (0) 2020.08.01
18.(C언어) 문자열  (0) 2020.08.01
17(C언어) 동적할당  (0) 2020.08.01
16.(C언어) 배열  (0) 2020.08.01
Comments