안녕하세요. 언제나 휴일이예요.
이번에는 원본 문자열에서 특정 문자를 제거하는 소스 코드입니다.
반복문 내에서 특정 문자를 만나면 strcpy 함수를 사용합니다.
소스 코드
//문자열에서 문자 제거 #include <stdlib.h> #include <stdio.h> void Eliminate(char *str, char ch); int main(void) { char str[] = "Hello World"; Eliminate(str, 'l'); printf("%s\n", str); return 0; } void Eliminate(char *str, char ch) { for (; *str != '\0'; str++)//종료 문자를 만날 때까지 반복 { if (*str == ch)//ch와 같은 문자일 때 { strcpy(str, str + 1); str--; } } }
Visual Studio에서 문자열 관련 함수는 string.h를 포함하였을 때 함수 원형을 확인할 수 있어요. 다음은 Visual Studio에서 작업할 때의 소스 코드입니다.
//문자열에서 문자 제거 #include <string.h> //#include <stdlib.h> #include <stdio.h> void Eliminate(char *str, char ch); int main(void) { char source[256] = ""; printf("입력 문자열:"); gets_s(source, sizeof(source)); printf("제거할 문자:");
char temp[256] = "";
scanf_s("%s", temp, sizeof(temp));
char ch = temp[0]; Eliminate(source, 'l'); printf("%s\n", source); return 0; } void Eliminate(char *str, char ch) { unsigned len = strlen(str) + 1; for (; *str != '\0'; str++,len--)//종료 문자를 만날 때까지 반복 { if (*str == ch)//ch와 같은 문자일 때 { strcpy_s(str,len, str + 1); str--; } } }
C11 표준에서는 strcpy 함수 대신 strcpy_s 함수를 사용할 것을 권고합니다. strcpy 함수에서 문자열을 기록할 버퍼의 크기보다 쓰여질 문자열 길이가 컸을 때 버퍼 오버플로우 버그를 방지하기 위해서입니다.
물론 Eliminate 함수에서 버퍼 오버플로우 문제가 발생할 확률은 0%여서 strcpy_s 함수를 호출해서 문제를 해결할 필요는 없다고 판단할 수 있습니다. 이에 관한 판단은 여러분께서 하시길 바랍니다.
//문자열에서 문자 제거 #include <stdlib.h> #include <string.h> #include <stdio.h> void Eliminate(char *str, char ch); int main(void) { char source[256] = ""; printf("입력 문자열:"); gets_s(source, sizeof(source)); printf("제거할 문자:"); char temp[256] = ""; scanf_s("%s", temp, sizeof(temp)); char ch = temp[0]; Eliminate(source, ch); printf("%s\n", source); return 0; } void Eliminate(char *str, char ch) { int len = strlen(str) + 1; for (; *str != '\0'; str++,len--)//종료 문자를 만날 때까지 반복 { if (*str == ch)//ch와 같은 문자일 때 { strcpy_s(str, len,str + 1); str--; } } }