2013-03-05 55 views
0

我在C以下代碼:Ç - 整數輸入驗證碼

#include "stdafx.h" 
#include <stdlib.h> 
#include <cstring> 
#include <ctype.h> 

int main() 
{ 
    char buffer[20]; 
    int num; 
    bool valid = true; 

    printf("Please enter a number\n"); 
    fgets(buffer, sizeof(buffer), stdin); 
    printf("\n\n"); 

    if(!isdigit(buffer[0])) //Checking if the first character is - 
    { 
     if(buffer[0] != '-') 
     { 
      valid = false; 
     } 

     else 
     { 
      if(!isdigit(buffer[1])) 
      { 
       valid = false; 
      } 
     } 
    } 

    char *pend = strrchr(buffer, '\n'); //Replacing the newline character with '\0' 

    if (pend != NULL) 
    { 
     *pend = '\0'; 
    } 

    for (int i = 1; i < strlen(buffer); i++) //Checking that each character of the string is numeric 
    { 
     if (!isdigit(buffer[i])) 
     { 
      valid = false; 
      break; 
     } 
    } 

    if(valid == false) 
    { 
     printf("Invalid input!"); 
    } 

    else 
    { 
     num = atoi(buffer); 
     printf("The number entered is %d", num); 
    } 
    getchar(); 
} 

基本上,代碼確保用戶輸入是正或負的整數。不允許使用字母,浮點數等。

該代碼完美工作,並很好地工作。

但是,代碼太長,我必須在很多程序中實現它。有沒有一種簡單的方法在C中執行所有上述操作?也許這確保輸入是更短的替代:

ⅰ)不是字母 ⅱ)的正或負整數

+0

把它放在一個可重用的函數中。將該文件包含在各個項目中。你可能會縮小代碼,但是當顯而易見的解決方案是使你可以重用時,我懶得去讀它。 – evanmcdonnal 2013-03-05 20:22:07

+1

使用標準庫。 'strtol'完成了所有這些。 – 2013-03-05 20:22:39

+0

@ n.m。 'strtol()'不會正確返回錯誤。 – 2013-03-05 20:24:48

回答

1
bool valid = false; 
char *c = buffer; 
if(*c == '-'){ 
    ++c; 
} 
do { 
    valid = true; 
    if(!isdigit(*c)){ 
     valid = false; 
     break; 
    } 
    ++c; 
} while(*c != '\0' && *c != '\n'); 

注意:這將不能處理的十六進制值,但將通過八進制(整數從0開始)

我也必須同意這應該放在一個共同的庫中,並作爲函數調用。

+0

你從未將'valid'設置爲'true'。另外,「bool」,「true」和「false」應來自標題或定義。 – 2013-03-05 20:26:21

+0

已更改爲初始化爲真。是的,你應該包含stdbool.h來聲明bool,true和false。 – tletnes 2013-03-05 20:27:05

+1

@Alexey Frunze如果您覺得有必要,請隨時編寫完整的迴歸套件。 – tletnes 2013-03-05 20:30:35

0

雖然有人指出,strtol將可能不會給你你需要的錯誤,這是做事情很常見的類型,因此它在標準庫中存在:

http://www.cplusplus.com/reference/cstdio/sscanf/

#include <stdio.h> 

// .... 

valid = sscanf (buffer,"%d",&num); 

另一個評論是,你不應該害怕編寫複雜和有用的代碼,並將其模塊化。爲您認爲有用的輸入分析例程創建一個庫!