easy software

C언어 strcmp(strncmp) 와 strcpy(strncpy) 함수 본문

C언어/변수와 함수

C언어 strcmp(strncmp) 와 strcpy(strncpy) 함수

JAVA 웹개발자 2015. 3. 8. 17:12

strcmp(strncmp) 함수란?

 

 

문자열을 비교하는 함수입니다.

 

#include <string.h>

int strcmp(const char * s1, const char * s2);

int strncmp(const char * s1, const char * s2, size_t n);

 

으로 정의되어 있으며, 두 문자열의 내용이 같으면 0, 다르면 0이 아닌 값을 반환합니다.

 

strcmp 함수는 문자열 전체를 비교하고,

 

strncmp 함수는 세번째 인자로 전달된 수만큼의 문자를 비교합니다.

 

 

#include <stdio.h>

#include <string.h>

 

int main(void){

char str1[20];

char str2[20];

 

printf("문자열 입력 1: ");

scanf("%s", str1);

printf("문자열 입력 2: ");

scanf("%s", str2);

 

//str1과 str2과 동일하면 0을 반환하게 됨

//0은 거짓을 의미

//! 을 붙여 참으로 바꾸어줌

if(!strcmp(str1, str2)){

puts("두 문자열은 완벽히 동일합니다.");

}

else{

puts("두 문자열은 동일하지 않습니다.");

 

if(!strncmp(str1, str2, 3))

puts(그러나 앞 세 글자는 동일합니다.");

}

return 0;

}

 

 

 

출력결과

 

문자열 입력 1: Simple

문자열 입력 2: Simon

두 문자열은 동일하지 않습니다.

그러나 앞 세 글자는 동일합니다.

 

 

 

 

strcpy(strncpy) 함수란?

 

 

문자열을 복사하는 함수입니다.

 

#include <string.h>

char * strcpy(char * dest, const char * src);

char * strncpy(char * dest, const char * src, size_t n);

 

으로 정의되어 있으며, 복사된 문자열의 주소값을 반환합니다.

 

strcpy는 문자열 전체를 복사하게 되며,

 

strncpy는 최대 세번째 인자로 전달된 숫자만큼만 복사하라는 의미입니다.

 

설명이 조금 아리송 할 수 있으니 아래 코드를 통해 결과를 확인해 보세요.

 

 

#include <stdio.h>

#include <string.h>

 

int main(void){

char str1[20] = "1234567890";

char str2[20];

char str3[5];

 

/**** case 1 ****/

strcpy(str2, str1);

puts(str2);

 

/**** case 2 ****/

strncpy(str3, str1, sizeof(str3));

puts(str3);

 

/**** case 3 ****/

strncpy(str3, str1, sizeof(str3)-1);

str3[sizeof(str3)-1] = 0;

puts(str3);

return 0;

}

 

 

출력결과

 

1234567890

12345○○○○○?234567890

1234

 

 

case 2의 출력결과가 조금 이상합니다.

 

최대 str3만큼만 복사해야 하는데 값이 뒤에 더 붙어있네요?

 

이유는 strncpy는 상당히 단순한 함수이기 때문에, 5개만 복사하라고 하면

 

딱 5개의 문자만 복사를 합니다. 마지막 문자가 NULL문자인지 아닌지는 판단하지 않습니다.

 

따라서 위의 문장 실행 후 str3에 저장되는 다섯 개의 문자는 1,2,3,4,5 입니다.

 

NULL문자가 포함되어 있어야 NULL문자 이전까지 출력을 할텐데, NULL문자가 없으니

 

출력결과가 이상할 수 밖에 없는 것이죠.

 

위의 결과는 NULL문자를 찾을 때까지

 

메모리에 연속적으로 붙어있는 문자열을 출력한 것입니다.

 

재수가 없으면 NULL문자를 찾을때까지 메모리 전체를 돌아다녀야 할 수도 있겠죠?

 

그래서 strncpy의 세번째 인자로 배열의 실제 길이보다 하나 작은 값을 전달해서,

 

NULL문자가 삽입될 공간을 남겨두고 복사를 해야 합니다.

 

그리고 이어서 배열의 끝에 NULL문자를 삽입해야 합니다.

 

주의하세요!

Comments