2017-04-17 2 views
-1

CHAR 변수에서 공백과 문자를 어떻게 감지 할 수 있는지 알고 있습니까?C에서 Char의 공백 문자를 찾는 방법은 무엇입니까?

내가 숫자의 입력에서 문자 나 공간을 감지해야합니다

이 내가하고 싶은 것 :

Enter Document Number of 8 numbers: 
// i press space and pressed enter 
ERROR: please enter the age again: 4fpdpfsg 

내 코드는 4 후 문자를 인식하지 않는 경우,있다와 내가 원하는 입력에서 문자가 있음을 인식하고, 다음 만 4

int isLetter(char input[]){ 
    int i = 0; 

    while(input[i]!='\0'){ 
     if((input[i]!=' ') && (input[i]<'a'||input[i]>'z') && (input[i]<'A'||input[i]>'Z')) 
     return 0; 
     i++; 
    } 

    return 1; 
} 
+2

'isalpha' 및 유사한 기능 계열을 사용해보십시오. –

+1

코드에 어떤 문제가 있습니까? 실행됩니까? 잘못된 결과가 나옵니까? –

+0

실행하지만 예를 들어 입력은 올바른 8 "숫자"로 인식 할 수 없습니다. 12345678과 같은 숫자가 없지만 1234abcd가 1234를 감지하면 입력 오류 메시지가 표시됩니다. – Alexander

답변

2

한번에 보여줍니다

,
if (!((input[i] == ' ') || (input[i] >= 'a' && input[i] <= 'z') || (input[i] >= 'A' && input[i] <= 'Z'))) 

또는 더 나은 :

#include <ctype.h> 
if (!((input[i] == ' ') || isalpha(input[i]))) 
2

표준 C 라이브러리의 다양한 문자 유형 테스트 기능이 있습니다. 그들은 #include <ctype.h> 헤더에 선언되어 있습니다.

불행히도 이러한 기능을 사용하는 분명한 방법은 종종 잘못되었습니다. 그들은 실제로 0에서 UCHAR_MAX 범위의 부호없는 문자 값 (바이트)이 예상되는 유형 int의 인수를 취합니다. 당신이 부정적 일어나는 char 값에 전달하면, 정의되지 않은 동작은 우연의 일치에 의해 일, crash 또는 더 나쁜 아직 형태의 유사한 취약점이 (아마도 더) Heartbleed와 할 수있는 계속된다.

따라서 (unsigned char)에 캐스팅은 매우 가능성이 필요한 다음의 경우 : C 번역 시간 문자 집합에서 파생

#include <ctype.h> 
/* ... */ 
    char ch; 
    /* ... */ 
    if (isalpha((unsigned char) ch) || ch == ' ') { 
    /* ch is an alphabetic character, or a space */ 
    } 

간단한 문자 상수 (안 숫자 탈출 한 사람) 실행 환경에서 양의 값을 가지고, 이러한 문자 만 조작 할 수 있다고 가정 할 수있는 코드는 캐스트없이 수행 할 수 있습니다. (예를 들어, 프로그램에 의해 조작되는 모든 데이터가 프로그램 자체의 문자열 또는 문자 리터럴에서 온 것이고 모든 리터럴은 기본 C 변환 시간 문자 집합을 사용합니다.)

즉, isalpha('a') 는 안전하다; a은 C 변환 시간 문자 집합이므로 문자 상수 'a'의 값은 양수입니다. 그러나 ISO-8859-1의 소스 코드로 작업 중이며 char ch = 'à';을 가지고 있다고 가정 해보십시오. char이 서명 된 경우이 ch은 음수 값을 갖습니다. ISO C에 따르면이 값은 기본 C 번역 문자 집합에 악센트 부호가 없기 때문에 괜찮습니다. isalpha(ch); 표현식은 음수 값을 isalpha 함수에 전달하는데 이는 잘못된 것입니다.

0

sscanf(input,"%d%n",&number,&nrOfDigits)을 사용하면 number에 정수 값을 읽고 nrOfDigits에 숫자의 일부가 아닌 첫 번째 문자의 위치를 ​​저장할 수 있습니다. 이 정보를 사용하여 수행 할 작업을 결정할 수 있습니다. nrOfDigits < 8은 입력이 8 자보다 짧거나 4 자리 미만이 포함되었음을 나타냅니다. 아래 사용법의 샘플 코드를 참조하십시오.

#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 

int isLetter(char input[]){ 

    int nrOfDigits=0; 
    int number; 
    int scannedElems = sscanf(input,"%d%n",&number,&nrOfDigits); 
    if (scannedElems == 0) {// number could not be read-- 
     printf ("No number read.\n"); 
     return 0; 
    } 
    else { 
     char c = input[nrOfDigits]; 
     int isAlpha = isalpha(c); 
     printf("input %s leads to number %d with %d digit(s); first characer after the digits is '%c', (isalpha=%d)\n", input, number, nrOfDigits, c, isAlpha); 
     return number; 
    } 
} 


int main(){ 

    isLetter("4fpdpfsg"); // input 4fpdpfsg leads to number 4 with 1 digit(s); first characer after the digits is 'f', (isalpha=1) 
    isLetter("afpdpfsg"); // No number read. 
    isLetter("12345678"); // input 12345678 leads to number 12345678 with 8 digit(s); first characer after the digits is '�', (isalpha=0) 
    return 0; 
} 

은 BTW : 당신은뿐만 아니라 strtoul와 유사한 논리를 구현할 수 있습니다.

0

헤이 나는 마침내 입력을 감지하는 방법은 단지 8 개 번호를 따른다받을 사람은 코드를 cmd를 실행 코드의

char* InputDni(char dni[]) 
{ 
    int sizeletter; 
    int i; 

    fflush(stdin); 
    gets(dni); 

    // 8 is the size of DNI in argentina 

    while((isLetter(dni)) || (strlen(dni)!=8)) 
    { 
     printf("ERROR: enter again the DNI: "); 
     fflush(stdin); 
     gets(dni); 
    } 

    sizeletter=strlen(dni); 

    for(i=0 ;i<sizeletter; i++) 
    { 
     while(isalpha(dni[i])) 
     { 
      printf("ERROR: enter again the DNI: "); 
      fflush(stdin); 
      gets(dni); 
      i++ 
     } 
    } 

    return dni; 
} 

// 대해서 isLetterOrDigit

int isLetter(char input[]) 
{ 
    int i = 0; 
    int sizeletter; 
    int flag=1; 

    sizeletter=strlen(input); 

    for(i=0;i<sizeletter;i++) 
    { 
     if((input[i]!=' ') && (input[i]<'a'||input[i]>'z') && (input[i]<'A'||input[i]>'Z')) 
     { 
      flag=0; 
     } 
    } 

    return flag; 
} 

사진을 프로그래머 :

code running

관련 문제