컴퓨터 엑셀 워드 포토숍 구글어스 WINDOWS JAVASCRIPT JAVA C++

 
Previous Post Java/자바] 문자열 치환, 문자 바꾸기, 모두 바꾸기; String Replace Al...[QnA] 영어 어원 사전 있는 곳은? - 영단어 어원 English Etymology D...자바/Java: jar 에러] Failed to load Main-Class manifes...자바/Java] GUI 기초, 기본 창(윈도) 만들기: Java Example, Simpl...자바/Java] 열거형 상수 정의, enum 타입 - Enumeration자바/Java] foreach 루프문 만들기, for문의 특수 형태Java(자바)와 C++의 다른 점, 장단점, 차이/차이점 - Java C++ Differ...텍스트에디터와 워드프로세서의 차이점, 다른 점 - Text Editor, Word-proc...자바/Java] class 파일로 컴파일하는 법은? - Compile to class fi...한글 아스키 코드표 (Hangul ASCII Code) 있는 곳은?

C언어] 문자열 치환 함수, 문자열 모두 바꾸기 - String Replace All

Tuesday, October 03, 2006

C언어에서는 문자열 치환 함수를 기본적으로 제공하지 않기에, 사용자가 직접 만들어야 합니다. 다음과 같은 replaceAll() 함수를 사용하여 문자열 바꾸기를 수행할 수 있습니다. 영문은 물론 2바이트인 한글도 잘 됩니다.

문자열 치환(Replace) 함수 예제


파일명: 0.cpp
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *replaceAll(char *s, const char *olds, const char *news);


void main(void){
  char s[] = "봉숭아 학당! 봉숭아 학당! 봉숭아 학당! 봉숭아 학당!";
  char *s2;

  printf("원본: %s\n", s);

  s2 = replaceAll(s, "봉숭아", "맹구");

  // 에러가 있으면 NULL 을 리턴. 에러가 없으면 결과 출력
  (s2 != NULL) ? printf("치환: %s\n", s2) : fputs("Replace String Error...\n", stderr);
}




char *replaceAll(char *s, const char *olds, const char *news) {
  char *result, *sr;
  size_t i, count = 0;
  size_t oldlen = strlen(olds); if (oldlen < 1) return s;
  size_t newlen = strlen(news);


  if (newlen != oldlen) {
    for (i = 0; s[i] != '\0';) {
      if (memcmp(&s[i], olds, oldlen) == 0) count++, i += oldlen;
      else i++;
    }
  } else i = strlen(s);


  result = (char *) malloc(i + 1 + count * (newlen - oldlen));
  if (result == NULL) return NULL;


  sr = result;
  while (*s) {
    if (memcmp(s, olds, oldlen) == 0) {
      memcpy(sr, news, newlen);
      sr += newlen;
      s  += oldlen;
    } else *sr++ = *s++;
  }
  *sr = '\0';

  return result;
}



실행 결과:

원본: 봉숭아 학당! 봉숭아 학당! 봉숭아 학당! 봉숭아 학당!
치환: 맹구 학당! 맹구 학당! 맹구 학당! 맹구 학당!



문자열 바꾸기 함수 출처: http://groups.google.co.kr/group/comp.lang.c

replaceAll() 함수는 제가 만든 것이 아니고, 위의 뉴스그룹에 Netocrat 이라는 분이 올리신 C소스를, C++ 모드에서도 컴파일되게 약간 고친 것입니다.

소스에서 sr 은 string recursive 라는 뜻 같기도 합니다 -_-?


아무튼 순수한 C언어로 된 문자열 치환 함수는 아주 구하기 힘들었습니다. 테스트 과정에서 버그가 발견되었는데 결국 고치지 못한 함수도 있었습니다. 그렇지만 여기 소개하는 함수는 적어도 저의 테스트는 통과했습니다. 정밀한 테스트는 아니기에, 메모리 누수 같은 것이 없다고 장담할 수는 없습니다.


문자열 s 속에서, 일치하는 문자열을 모두 바꾸어 s2 에 대입합니다.

s2 = replaceAll(s, "숭아", "맹구");

이것은 "봉숭아 학당! 봉숭아 학당! 봉숭아 학당! 봉숭아 학당!" 이라는 원본 문자열에서, 모든 "숭아"를 "맹구"로 바꿉니다.

실행 결과:

원본: 봉숭아 학당! 봉숭아 학당! 봉숭아 학당! 봉숭아 학당!
치환: 봉맹구 학당! 봉맹구 학당! 봉맹구 학당! 봉맹구 학당!





이렇게 한글 자모와 영문이 섞여도 잘 작동하는군요.

char s[] = "Google";
s2 = replaceAll(s, "oo", "ㅎㅎ");

실행 결과:

원본: Google
치환: Gㅎㅎgle



☞ C/C++

2 Comments:
At 11:26 PM, Blogger 정원현 said...

감사합니다 ㅎㅎ

 
At 4:16 AM, Blogger 김남규 said...

감사합니다

 

Post a Comment

<< Home RSS 2.0 feed

구글 Google 에서 제공하는 무료 블로그 서비스인 블로거 Blogger 의 인터넷 주소는 www.blogger.com 입니다. Blogger 에 블로그를 만들면, blogspot.com 이라는 주소에 블로그가 생성됩니다.
블로그를 직접 방문하지 않고도 최신 게시물을 구독하려면 RSS 2.0 feed 주소를 리더기에 등록하시면 됩니다.
Categories
Previous Posts
Monthly Archives
Top