2013-03-05 44 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); 

另一个评论是,你不应该害怕编写复杂和有用的代码,并将其模块化。为您认为有用的输入分析例程创建一个库!