C에서 문자열 자르기

Jinku Hu 2023년10월12일
C에서 문자열 자르기

이 기사에서는 C에서 문자열을 자르는 방법에 대한 여러 방법을 소개합니다.

포인터 산술과 함께 사용자 지정 함수를 사용하여 문자열 자르기

C의 문자열은 null 바이트-\0로 끝나는 문자 배열 일 뿐이므로 현재 포인터를 주어진 자리 수만큼 문자열의 시작 부분으로 이동하고 새 포인터 값을 반환하는 사용자 지정 함수를 구현할 수 있습니다.

하지만 두 가지 문제가 있습니다. 첫 번째는 주어진 문자열을 왼쪽 또는 오른쪽에서 자르는 옵션이 필요하고 두 번째는 끝을 표시하기 위해 널 바이트를 삽입해야하므로 포인터를 문자열의 오른쪽에서 이동하는 것으로 충분하지 않다는 것입니다. 따라서 우리는 문자열에서 잘라 내기 위해 문자열과 여러 문자를 취하는truncString함수를 정의합니다. 숫자는 음수 일 수 있으며, 주어진문자수를 제거 할면을 나타냅니다. 다음으로strlen함수를 사용하여 문자열 길이를 검색합니다. 이는 사용자가 유효한 문자열을 전달해야 함을 의미합니다. 그런 다음 길이를 잘라낼 문자 수와 비교 한 다음 포인터 조작을 수행합니다.

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *truncString(char *str, int pos) {
  size_t len = strlen(str);

  if (len > abs(pos)) {
    if (pos > 0)
      str = str + pos;
    else
      str[len + pos] = 0;
  }

  return str;
}

int main(void) {
  char *str1 = "the string to be truncated";

  printf("%s\n", str1);
  printf("%s \n", truncString(strdupa(str1), 4));
  printf("%s \n", truncString(strdupa(str1), -4));

  exit(EXIT_SUCCESS);
}

출력:

the string to be truncated
string to be truncated
the string to be trunc

문자열의 길이와 전달 된 숫자를 빼서 계산 된 문자 위치에0값을 할당합니다. 따라서 우리는 문자열의 끝을 이동하고 그 값을 인쇄하는 것은 이전 포인터로 수행 할 수 있습니다.

또는 동일한 프로토 타입으로 유사한 함수truncString2를 구현할 수 있지만 문자열을 두 번째 인수로 전달 된 문자 수로 자릅니다. 숫자의 부호는 새 문자열을 형성 할면을 나타냅니다. 즉, 양의 정수는 왼쪽을 나타내고 음수는 그 반대를 나타냅니다.

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *truncString2(char *str, int pos) {
  size_t len = strlen(str);

  if (len > abs(pos)) {
    if (pos > 0)
      str[pos] = 0;
    else
      str = &str[len] + pos;
  } else {
    return (char *)NULL;
  }

  return str;
}

int main(void) {
  char *str2 = "temporary string variable";

  printf("%s\n", str2);
  printf("%s \n", truncString2(strdupa(str2), 6));
  printf("%s \n", truncString2(strdupa(str2), -6));

  exit(EXIT_SUCCESS);
}

출력:

the string to be truncated
string to be truncated
the string to be trunc
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

관련 문장 - C String