2017-04-17 135 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>標題中聲明。

不幸的是,使用這些函數的明顯方式往往是錯誤的。他們採用類型爲int的參數,該參數實際上預計爲0到UCHAR_MAX範圍內的無符號字符值(有效字節)。如果您在char值恰好是負傳球,未定義行爲隨之而來,這可能工作巧合crash或更糟糕的是形式類似於一個漏洞心臟出血漏洞(可能更糟)

因此投給(unsigned char)很可能需要在以下幾點:

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

簡單的字符從C轉換時的字符集導出的常數(不是數字逃脫的人)必須在執行環境正值;可以安全地假定它只能操縱這些角色的代碼可以在沒有演員的情況下進行。 (例如,如果程序操縱的所有數據都來自程序本身的字符串或字符文字,並且所有這些文字都只使用基本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; 
} 

// isLetter

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

相關問題