본문으로 바로가기
반응형

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가 모두 제거가 되었다.

반응형