C & C++

[C언어] 배열, 문자열 슬라이싱 구현 예제

jimmy_AI 2022. 9. 23. 00:01
반응형

파이썬 등의 일부 프로그래밍 언어에서는 다음과 같이 특정 위치 부분을 추출하는

"슬라이싱"이라는 기능을 제공합니다.

list_a = [1, 3, 5, 7, 9]
str_a = "hello world!"

# 파이썬 슬라이싱 예시
print(list_a[1:4]) # [3, 5, 7]
print(str_a[2:6]) # "llo "

 

그렇다면 C언어에서도 배열이나 문자열에 대하여 위와 같은 슬라이싱을 적용할 수 있을까요?

 

결론부터 말씀드리면, 포인터 및 동적할당을 통하여 간접적인 방법으로는 가능합니다!

여기서는 정수 배열 및 문자열에 대하여 슬라이싱 기능을 하는 함수를 구현해보도록 하겠습니다.

 

 

C언어 배열 슬라이싱 구현

arr_slicing(arr, start, end) 형태

int 자료형 배열 arr, 시작 인덱스 번호 start, 끝 인덱스 번호 end가 주어졌을 때,

 

arr의 start 번호부터 end - 1 번호까지 구간의 값들로 재구성한 배열을 반환하는 함수인

arr_slicing을 구현한 예시 코드는 아래와 같습니다.

 

함수에서 배열을 반환받기 위하여 포인터 및 동적 할당 기능을 활용하였습니다.

#include <stdio.h>
#include <stdlib.h>

// input : 배열 arr, 시작 및 끝 인덱스 번호 start, end(start ~ end - 1번째 추출)
int* arr_slicing(int* arr, int start, int end){

  int arr_size = end - start; // 슬라이싱된 배열 크기 선언
  int* slice_arr  = (int *)malloc(sizeof(int) * arr_size); // 동적 할당

  // 슬라이싱 결과 배열에 값 대입
  for(int i = 0; i < arr_size; i++){
  slice_arr[i] = arr[start + i];
}
  return slice_arr;
}
 
int main() 
{   
  int a[] = {3, 8, 2, 9, 7}; // 배열 선언
  
  int* b = arr_slicing(a, 2, 5); // 2 ~ 4번 위치 값 가져오기

  // 슬라이싱된 배열 결과 확인
  for(int i = 0; i < 3; i++){
  printf("%d ", b[i]);
} 
  // 출력 결과 : 2 9 7 

}

int 자료형 배열이 아닌 다른 자료형의 배열에 대한 슬라이싱도 위의 함수 코드에서

배열(포인터)의 자료형만 수정하여 마찬가지로 적용이 가능합니다.

 

반응형

 

C언어 문자열 슬라이싱 구현

문자열 슬라이싱은 위의 배열 슬라이싱 코드에서 char 자료형 배열인 경우로만 바꿔주시면

전반적인 구조는 동일합니다.

 

마찬가지로 문자열 s에 대하여 start ~ end - 1번 인덱스 위치 부분 문자열을 추출하는

str_slicing(s, start, end) 함수를 구현한 예시 코드는 다음과 같습니다.

#include <stdio.h>
#include <stdlib.h>

// input : 문자열 s, 시작 및 끝 인덱스 번호 start, end(start ~ end - 1번째 추출)
char* str_slicing(char* s, int start, int end){

  int str_size = end - start; // 슬라이싱된 문자열 크기 선언
  char* slice_str  = (char *)malloc(sizeof(char) * str_size); // 동적 할당

  // 슬라이싱 결과 문자열에 값 대입
  for(int i = 0; i < str_size; i++){
  slice_str[i] = s[start + i];
}
  return slice_str;
}
 
int main() 
{   
  char a[] = "hello world!"; // 문자열 선언
  
  char* b = str_slicing(a, 1, 7); // 1 ~ 6번 위치 값 가져오기

  // 슬라이싱된 문자열 결과 확인
  for(int i = 0; i < 6; i++){
  printf("%c", b[i]);
} 
  // 출력 결과 : ello w

}