반응형
c언어에서 string에서 특정 문자를 제거하는 방법에 대해서 포스팅을 하려고 한다. parser를 만들때 생각보다 사용할 일이 종종 생길 것으로 보인다.
먼저 코드만 간단하게 써보면 이렇게 된다.
#define _CRT_SECURE_NO_WARINGS는 strcpy를 그냥 사용하면 컴파일러 경고가 뜨기 때문에 추가를 하였다.
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "string.h"
void remove_char(char* str);
int main(void)
{
char str[50];
memset(str, 0x00, sizeof(str));
strcpy(str, "abcd\r\n");
printf("1. %s", str);
printf("2. %s", str);
remove_char(str);
printf("%s", str);
printf("%s", str);
return 0;
}
void remove_char(char* str)
{
char* read = str;
char* write = str;
while (*read) {
if (*read != '\r' && *read != '\n') {
*write++ = *read;
}
read++;
}
*write = '\0';
}
실행결과
1. abcd
2. abcd
abcdabcd
"abcd\r\n" 라는 문자를 2줄을 출력을 하였고 remove_char에서 \r(캐리지 리턴)과 \n(라인피드)이 있으면 제거를 하도록 추가를 하였다.
char* read = str;
char* write = str;
remove_char함수에서 str 매개변수를 *read와 *write에 각각 가져온다. 여기서 *write에 str을 대입하지 않으면 주소는 랜덤한 값을 갖기 때문에 매개변수의 주소가 아닌 엉뚱한 주소를 받아 문제가 생긴다.
while (*read) {
if (*read != '\r' && *read != '\n') {
*write++ = *read;
}
read++;
}
*write = '\0';
1. read 데이터를 한 문자씩 읽는다.
2. 읽은 문자가 '\r'(캐리지 리턴)과 '\n'(라인피드)인지 확인
3. 해당 문자일 경우 무시하고 다음 문자를 읽는다. 그렇지 않은 경우 write 주소에 문자를 저장하고 write 포인터 이동.
4. 문자를 다 쌓고 나면 write 포인터가 가리키는 위치에 null 문자를 추가하여 문자열 종료.
다른 문자를 제거하고 싶다고 하면 아래와 같이 하면 된다.
#define _CRT_SECURE_NO_WARNINGS
#include "stdio.h"
#include "string.h"
void remove_char(char* str);
int main(void)
{
char str[50];
memset(str, 0x00, sizeof(str));
strcpy(str, "abcd\r\n");
printf("1. %s", str);
printf("2. %s", str);
remove_char(str);
printf("%s", str);
printf("%s", str);
return 0;
}
void remove_char(char* str)
{
char* read = str;
char* write = str;
while (*read) {
if (*read != 'a' && *read != 'b' && *read != 'c') {
*write++ = *read;
}
read++;
}
*write = '\0';
}
실행결과
1. abcd
2. abcd
d
d
제거할 문자에 a, b, c를 추가하였더니 결과에 a, b, c가 모두 제거가 되었다.
반응형
'프로그래밍 > C' 카테고리의 다른 글
| c언어 utc에서 한국 시간 kst 변환 ISO 8601 형식 (0) | 2025.06.09 |
|---|---|
| 예제로 알아보는 재귀 함수 (0) | 2021.01.27 |
| 이중 연결 리스트(Double linked list), 이중 원형 연결 리스트 예제 (2) | 2020.01.05 |
| 프로그래머스 2016년, 날짜에 따른 요일 구하기 (2) | 2019.12.22 |