본문 바로가기

별걸다하는 IT/프로그래밍언어

[C언어][ctype.h][isspace] 공백,탭,개행 등을 검사해주는 isspace 함수 (whitespace 판별), 공백제거하기

안녕하세요~ 

C언어 함수 관련 포스팅은 오랜만이군요 ㅎㅎ

그동안 바빠서 블로그 관리를 하지 못했다가 최근들어 차츰차츰 해보려고 해요. 

 

오늘은 그 많고 많은 함수 중 isspace해 작성해보려고 합니다.

공백, 탭 등등 이런 문자들을 whitespace라고 하는데 이 함수는 whitespace인지 아닌지를 판단해줘요.(whitespace라는 언어도 있음..) 

whitespace를 판별해주는 함수 isspace

whitespace의 종류?

그럼 어떤 문자가 whitespace에 해당이 될까요?

문자 헥사값 코드
' ' 0x20 SPC(SP) 스페이스 , 공백
'\n' 0x0a LF 라인피드
'\t' 0x09 TAB(아스키코드상 HT) 수평 탭 
'\v' 0x0b VT 수직 탭
'\f' 0x0c FF 폼 피드
'\r' 0x0d CR 캐리지리턴

판별하고자 하는 문자가 요 종류인지 아닌지 알려줍니다.

헤더파일

#include <ctype.h>

ctype헤더에는 이런 판별함수들이 많은데요.

많이 쓰는걸로는, isalpha, isdigit, isalnum 등이 있습니다. 함수명만 봐도 추측할 수 있듯이 각, 알파벳인지 판별하는, 숫자형문자인지 판별하는,, 알파벳또는 숫자인지 판별하는 기능을 합니다.

함수 프로토타입

int isspace ( int c );

인자

int c : 판별할 문자

리턴값

만약 인자에 있는 값이 whitespace에 해당되면 0이 아닌 값을 리턴하고 

whitespace가 아니면 0을 리턴한다.

쉽게 생각해서 is space? 너는 스페이스냐? 스페이스가 아냐. --> false (0)리턴, space면 0이 아닌 값을 리턴.

사용 예시

 간단한 사용법.

#include <ctype.h> 
#include <stdio.h> 
int main() 
{ 
    char ch = ' '; 
  
    if (isspace(ch)) 
        printf("\nEntered character is space"); 
    else
        printf("\nEntered character is not space"); 
} 

쉽죠 ?

 

좀 응용해서, whitespace를 다 제거하는 함수를 만들어보기 

#include <stdio.h>
#include <ctype.h>
#include <string.h>
void remove_spaces(char *s);
int main() {
    char s[100] = "H a p p y New Year  !";
    remove_spaces(s);
    printf("%s", s);
    return 0;
}
void remove_spaces(char* s) {
    char* d = s;
    do {
        while (isspace(*d)) {
            ++d;
        }
        *s++ = *d++;
    } while (*s != '\0');
}

결과창

C++에서 문자열이 space만으로 구성되어 있는지 확인하는 법

bool whiteSpacesOnly = std::all_of(s.begin(),s.end(),isspace);

string 클래스의 begin함수와 end함수의 경우에는 아래 포스팅을 참조해주세요! :)

 

[C++]string 총정리 2탄(clear, empty, 문자열 추출 substr, 반복자 begin/end, 변경 replace, 제거 erase)

[C언어, C++언어, Java언어 기초 프로그래밍 완전 정복 목차!] [C++] 저번 포스팅에서 String 사용하는 법 1탄을 살펴봤어요. 총정리가 뭔가 깔끔한거같아서 제목은 바꿨지만 저번 String 포스팅에 이어서 기능들..

jhnyang.tistory.com

isspace() 변형 

[공백과 탭만 체크하는 isspace 구현해보기] 

bool isspace(int c)
{
   return c == ' ' || c == '\t'; 
}

이 함수는 당연히 리턴타입이 bool이니까 0또는 1만 나오겠죠. 공백이거나 탭이면 true리턴~! 위처럼 함수로 구현할 수도 있고 아래처럼 매크로로 구현할 수도 있어요.

#define IS_SPACE(x) ((x) == ' ' || (x) == '\t')

구현하기는 어렵지 않습니다.

주의할 점

흔히 하는 실수~

if(isspace(req_data.first) != true)
{
	printf("is space가 true가 아니야. 공백이 아닐때 여기를 타겠지?");
}
else 
{
	printf("공백이야");
}

true가 기준이 아니라 false가 기준이예요! 리턴 값이 0과 1 두 값 중에 하나인게 아닙니다. 

해당 문자가 whitespace인데 리턴값이 1이 아니라 524일 수도 있어요. 그래서 공백인데도 첫번째 분기문을 탈 수 있습니다. 즉 whitespace가 있으면 0만 아닌거.  

if(isspcae(req_data.first) == false)
{
	printf("first글자는 whitespace가 아니야");
}
else 
{
	printf("first글자는 whitespace야");
}

이렇게 짜야 맞습니다.

오늘은 여기까지입니다! 도움이 되셨다면, 공감, 댓글 광고보답은 어떤가요? 정보공유에 힘이 됩니다. 

그럼 다음 포스팅에서 뵈어요~~