2011-05-10 7 views
2

C의 문자열이 공백으로 구성되었는지 확인하는 가장 효율적이고 안전한 방법은 무엇입니까? 확인을 위해 함수를 직접 작성해야합니까, 아니면 사용할 수있는 string.h에있는 함수가 있습니까?문자열이 공백으로 구성되었는지 감지하고 있습니까?

+1

'is' \ * 함수에주의하십시오 : ** 인자는 ** unsigned char로 변환되어야합니다. [C99 표준] (http://www.open-std.org/JTC1/sc22/wg14/www/docs/n1256.pdf)의 7.4/1을 참조하십시오. – pmg

답변

5

글쎄, 자신을 작성하는 것은 간단하다 : 당신이 표준 라이브러리에서 사용

int IsSpaces(char * s) { 

    while (* s) { 
     if (! isspace(* s)) { 
      return 0; 
     } 
     s++; 
    } 
    return 1; 
} 

아무것도 훨씬 더 효율적으로 될 가능성이 없습니다.

+6

불쾌감은 없습니다.하지만 코딩 스타일을 읽기가 매우 어렵습니다. – orlp

+0

@night 죄송합니다. 실제로 C 및 C++ 사람들이 내가 할 수있는만큼 명확하게 가르치는 데 수년간 개발되었습니다. –

+1

나에게 읽기 어려운 부분은 괄호 안의 내용 주위의 공간입니다. 그게 어떻게 쉽게 읽을 수 있는지 모르겠습니다. 그것은 논리적으로 함께 움직이는 것들을 나누는 것처럼 보입니다. –

1

공간을 말하면 정확히 또는 공백 문자입니까?

그러나, 이러한 기능이없는이 그래도 작동합니다

int isonlyspaces(char *str) { 
    while (isspace(*str++)); 
    return --str == '\0'; 
} 
+0

UB :'isspace ((unsigned char) * str ++)'를 피하기 위해 isspace 인수를 캐스팅하십시오. – pmg

+0

@pmg : AFAIK'isspace'는 int를 취하도록 정의되어있어 아무 문제가 없습니다. – orlp

+0

'char'는 서명되지 않았습니까? ...'char * buf = "José Peña";' – pmg

5

이 시도 :

int isonlyspaces(char *str) { 
    while (*str++ == ' '); 
    return --str == '\0'; 
} 

대신 리터럴 공간의 문자 간격을 의미하는 경우,이 버전이 적절한

if (!s[strspn(s, " ")]) /* it's all spaces */ 

"spaces"의 정의에 탭, 개행 문자 등을 포함 시키려면 sim 두 번째 인수에 strspn을 추가합니다.

+0

코드 줄이 멋지고, 영리하며, 이해하기가 어렵습니다 (특히 구문 오류가 수정되기 전에는 특히 그렇습니다). – ypnos

+0

strspn() == strlen()보다 효율적입니다. 후행 \ 0 바이트 IFF에 대한 색인을 작성할 것이라는 의견을 가질만한 가치가있을 수 있습니다. 범위는 전체 길이이므로! '\ 0'은 true-ish가됩니다. – Roboprog

1

man string.h 나를 다음 맨 페이지로 안내했습니다.

NAME strspn는 건 strcspn는 -

  • strspn() 함수는 초기의 길이를 계산하는 문자

    SYNOPSIS

    #include <string.h> 
    
        size_t strspn(const char *s, const char *accept); 
    
        size_t strcspn(const char *s, const char *reject); 
    

    DESCRIPTION 세트의 문자열을 검색의 세그먼트는 전체적으로 문자로 구성됩니다. in acce 태평양 표준시.

  • 건 strcspn() 함수는 전체적으로 문자에 거부하지 이루어져 S의 초기 세그먼트의 길이를 산출한다.

관련 문제