strcpy, strcat 직접 구현해서 문자열 출력하기

문성원·2024년 2월 11일
0

C/C++

목록 보기
3/3

본 실습은 Do it C언어 입문 실습 예제를 참조하여 만들었습니다.

1. 기존 실습 예제 코드

  • strcpy, strcat 함수를 사용
#include <stdio.h>
#include <string.h> // strcpy, strcat 함수 사용하기 위한 문자열 헤더파일

int main()
{
	char data[10] = {'H', 'e', 'l', 'l', 'o', 0,};
    char result[12];
    strcpy(result, data);
    strcat(result, " world");
    printf("%s\n", result);
    return 0;
}
  1. data 문자열 배열을 통해 7개의 문자열 H, e, l, l, o, 0 저장
  2. Hello world 문자열 전체를 저장하기 위한 새로운 문자열 배열 result 선언
  3. strcpy 함수를 사용하여 data 배열에 저장되어 있는 문자열 배열을 result 배열에 복사
  4. strcat 함수를 사용하여 result 배열에 " world" 문자열을 합침
  5. 문자열을 출력하는 형식 ["%s" -> string 문자열 형태의 데이터 저장]을 사용하여 Hello world 문자열 출력

2. 함수를 통해 직접 구현해서 출력하는 코드

  • 포인터 변수를 매개변수로 가진 함수로 구현하는 코드
#include <stdio.h>

// 문자열 복사 함수
// 매개 변수를 포인터 변수로 설정
// 받는 값은 빈 문자열 배열(result[12]), Hello 문자열이 저장되어 있는 배열(data[10])
// char 배열이기 때문에 반환형은 char* 로 정의
char *string_copy(char *s1, char *s2){
	// s2 배열이 null값을 만나기 전까지 계속 반복
    while(*s2 != 0){
    	// s2에 들어 있는 문자들을 s1으로 대입
    	*s1 = *s2;
        // s1, s2의 주소들을 순차적으로 증가시키면서 문자 값들을 대입시킴
        s1++;
        s2++;
    }
    // s1 배열이 null을 만났을 경우 복사된 문자열 배열을 반환함
    *s1 = 0;
    return s1;
}

// 문자열 합침 함수
// 매개 변수를 포인터 변수로 설정
// 받는 값은 Hello 문자열 배열, " world"문자를 저장할 배열
// char 배열이기 때문에 반환형은 char* 로 정의
char *string_concat(char *s1, const char *s2){
	// Hello 문자열 배열을 null 만나기 전까지 데이터 저장
    while(*s1 != 0){
    	s1++;
    }
    // " world" 문자가 null을 만나기 전까지 순차적으로 기존의 문자열 배열에 데이터 저장
    while(*s2 != 0){
    	// world를 저장할 문자열 배열의 문자들을 hello 문자열 배열에 저장
    	*s1 = *s2;
        // 순차적으로 s1, s2의 주소드르을 증가시키면서 문자 값 대입
        s2++;
        s1++;
    }
    // s1 배열이 null인 경우 합쳐진 문자열 배열 반환
    *s1 = 0;
    return s1;
}

int main(){
	char data[10] = {'H','e','l','l','o',0, };
    char result[12];
    // string_copy함수 호출 
    string_copy(result, data);
    // string_concat함수 호출
    string_concat(result, " world");
    printf("%s\n", result);
    return 0;
}
  • 배열을 매개변수로 가진 함수로 구현하는 코드
#include <stdio.h>
// 문자열 복사 함수
// 매개 변수를 배열로 설정
// 받는 값은 빈 문자열 배열(result[12]), Hello 문자열이 저장되어 있는 배열(data[10])
char *string_copy(char dest[], char start[]){
    // 인덱스 초기화
    int i = 0;
    // Hello 문자열 배열의 요소에 순차적으로 접근할 때 null 만나기 전까지 반복
    while(start[i] != '\0'){
        // data배열의 문자 데이터들을 result배열에 대입
        dest[i] = start[i];
        // 인덱스 증가
        ++i;
    }
    // result 문자 배열이 NULL인 경우 result 배열 반환
    dest[i] = '\0';
    return dest;
}

// 문자열 합침 함수
// 매개 변수를 포인터 변수로 설정
// 받는 값은 result 문자열 배열, " world" 문자열 
// char 배열이기 때문에 반환형은 char* 로 정의(시작 주소부터 데이터 값 순차적으로 저장)
char *string_concat(char dest[], const char start[]){
    int i=0, j=0;
    // result 배열이 null 값을 만나기전까지 문자열 순차적으로 저장
    while(dest[i] != '\0'){
        ++i;
    }
    // " world" 문자열을 대입 시 null 나오기 전까지 순차적으로 저장
    while(start[j] != '\0'){
    	// world 문자를 result 문자열 배열에 대입
        dest[i] = start[j];
        // 각각의 인덱스 증가
        ++i;
        ++j;
    }
    // result 배열이 null 값을 만난 경우 result 배열 반환
    dest[i] = '\0';
    return dest;
}

int main(){
    char data[10] = {'H', 'e', 'l', 'l', 'o', 0};
    char result[12];
    string_copy(result, data);
    string_concat(result, " world");
    printf("%s\n", result);
    return 0;
}

3. 공식 문서의 strcpy, strcat 구문

// strcpy
char *strcpy(
	// 대상 문자열
	char *strDestination,
    // Null 종료 소스 문자열
    const char *strSource
);

// strcat
char *strcat(
	// 대상 문자열
	char *strDestination,
    // Null 종료 소스 문자열
    const char *strSource
);

해당 코드는 strcpy, strcat에 해당된 Window 공식 문서에서 따온 코드로 위에 작성된 코드처럼 대상 문자열 배열과 복사할 문자열 배열을 입력받아 출력하는 것을 알 수 있다.

4. 구현해 본 결과

  • 구현한 함수의 결과값 모두 "Hello world" 문자를 출력하는 것을 확인함
  • string.h 헤더 파일에서 strcpy, strcat 함수를 메인 코드 혹은 함수 영역에 붙여넣는 것도 중요하지만 두 개의 함수의 동작원리를 이해 해야 어떤 인지 값을 받고 있는 지에 대해 좀 더 명확히 알 수 있다는 것을 깨닫게 되었음.
profile
EasyWin32를 통해 C언어를 공부하고 있습니다~

0개의 댓글

관련 채용 정보