我在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中执行上述所有操作吗?也许更短的替代方案可确保输入:
i)不是一封信 ii)正数或负数
答案 0 :(得分: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开始的整数)
我还必须同意将它放在一个公共库中并作为函数调用。
答案 1 :(得分:0)
虽然有些人指出strtol可能不会给你提供你需要的错误,但这是一种非常常见的事情,因此它确实存在于标准库中:
http://www.cplusplus.com/reference/cstdio/sscanf/
#include <stdio.h>
// ....
valid = sscanf (buffer,"%d",&num);
另一个评论是,你不应该害怕编写复杂而有用的代码,并将其模块化。为您认为有用的输入解析例程创建一个库!