Tuesday, October 03, 2006
C언어] 문자열 치환 함수, 문자열 모두 바꾸기 - String Replace All
C언어에서는 문자열 치환 함수를 기본적으로 제공하지 않기에, 사용자가 직접 만들어야 합니다. 다음과 같은 replaceAll() 함수를 사용하여 문자열 바꾸기를 수행할 수 있습니다. 영문은 물론 2바이트인 한글도 잘 됩니다.
파일명: 0.cpp
실행 결과:
원본: 봉숭아 학당! 봉숭아 학당! 봉숭아 학당! 봉숭아 학당!
치환: 맹구 학당! 맹구 학당! 맹구 학당! 맹구 학당!
문자열 바꾸기 함수 출처: https://groups.google.com/g/comp.lang.c?pli=1
replaceAll() 함수는 제가 만든 것이 아니고, 위의 뉴스그룹에 Netocrat 이라는 분이 올리신 C소스를, C++ 모드에서도 컴파일되게 약간 고친 것입니다.
소스에서 sr 은 string recursive 라는 뜻 같기도 합니다 -_-?
아무튼 순수한 C언어로 된 문자열 치환 함수는 아주 구하기 힘들었습니다. 테스트 과정에서 버그가 발견되었는데 결국 고치지 못한 함수도 있었습니다. 그렇지만 여기 소개하는 함수는 적어도 저의 테스트는 통과했습니다. 정밀한 테스트는 아니기에, 메모리 누수 같은 것이 없다고 장담할 수는 없습니다.
문자열 s 속에서, 일치하는 문자열을 모두 바꾸어 s2 에 대입합니다.
s2 = replaceAll(s, "숭아", "맹구");
이것은 "봉숭아 학당! 봉숭아 학당! 봉숭아 학당! 봉숭아 학당!" 이라는 원본 문자열에서, 모든 "숭아"를 "맹구"로 바꿉니다.
실행 결과:
원본: 봉숭아 학당! 봉숭아 학당! 봉숭아 학당! 봉숭아 학당!
치환: 봉맹구 학당! 봉맹구 학당! 봉맹구 학당! 봉맹구 학당!
이렇게 한글 자모와 영문이 섞여도 잘 작동하는군요.
char s[] = "Google";
s2 = replaceAll(s, "oo", "ㅎㅎ");
실행 결과:
원본: Google
치환: Gㅎㅎgle
문자열 치환(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;
}
#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;
}
실행 결과:
원본: 봉숭아 학당! 봉숭아 학당! 봉숭아 학당! 봉숭아 학당!
치환: 맹구 학당! 맹구 학당! 맹구 학당! 맹구 학당!
문자열 바꾸기 함수 출처: https://groups.google.com/g/comp.lang.c?pli=1
replaceAll() 함수는 제가 만든 것이 아니고, 위의 뉴스그룹에 Netocrat 이라는 분이 올리신 C소스를, C++ 모드에서도 컴파일되게 약간 고친 것입니다.
소스에서 sr 은 string recursive 라는 뜻 같기도 합니다 -_-?
아무튼 순수한 C언어로 된 문자열 치환 함수는 아주 구하기 힘들었습니다. 테스트 과정에서 버그가 발견되었는데 결국 고치지 못한 함수도 있었습니다. 그렇지만 여기 소개하는 함수는 적어도 저의 테스트는 통과했습니다. 정밀한 테스트는 아니기에, 메모리 누수 같은 것이 없다고 장담할 수는 없습니다.
문자열 s 속에서, 일치하는 문자열을 모두 바꾸어 s2 에 대입합니다.
s2 = replaceAll(s, "숭아", "맹구");
이것은 "봉숭아 학당! 봉숭아 학당! 봉숭아 학당! 봉숭아 학당!" 이라는 원본 문자열에서, 모든 "숭아"를 "맹구"로 바꿉니다.
실행 결과:
원본: 봉숭아 학당! 봉숭아 학당! 봉숭아 학당! 봉숭아 학당!
치환: 봉맹구 학당! 봉맹구 학당! 봉맹구 학당! 봉맹구 학당!
이렇게 한글 자모와 영문이 섞여도 잘 작동하는군요.
char s[] = "Google";
s2 = replaceAll(s, "oo", "ㅎㅎ");
실행 결과:
원본: Google
치환: Gㅎㅎgle
tag: cpp
C언어 | C/C++ (Visual C++) 프로그래밍
감사합니다 ㅎㅎ
감사합니다
<< Home