c - 使用 atoi() 对整数进行输入验证

标签 c validation input numbers integer

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

void main()
{
    char buffer[20];
    int num;

    printf("Please enter a number\n");
    fgets(buffer, 20, stdin);
    num = atoi(buffer);

    if(num == '\0')
    {
        printf("Error Message!");
    }

    else
    {
        printf("\n\nThe number entered is %d", num);
    }

    getchar();
}

上面的代码接受字符串形式的数字,并使用atoi将其转换为整数。如果用户输入小数,则仅接受小数点之前的位。而且,如果用户输入字母,则返回0。

现在,我有两个疑问:

i) 我希望程序检测用户是否输入了带小数点的数字并输出错误消息。我不希望它取小数点之前的部分。我希望它识别出输入无效。

ii) 如果 atoi 在有字母的情况下返回 0,那么我如何验证它,因为用户也可以输入数字 0?

谢谢。

最佳答案

atoi 不适合错误检查。请改用 strtolstrtoul

#include <errno.h>
#include <limits.h>
#include <stdlib.h>
#include <string.h>

long int result;
char *pend;

errno = 0;
result = strtol (buffer, &pend, 10);

if (result == LONG_MIN && errno != 0) 
{
  /* Underflow. */
}

if (result == LONG_MAX && errno != 0) 
{
  /* Overflow. */
}

if (*pend != '\0') 
{
    /* Integer followed by some stuff (floating-point number for instance). */
}

关于c - 使用 atoi() 对整数进行输入验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54976142/

相关文章:

c - 如何使 switch 语句正确循环?

javascript - JavaScript 中的 JSON 对象验证

原始输入多行字符串时python运行时错误

c - 为什么我不能传入变量来实现交换功能?

c - 当我替换正在运行的 PostgreSQL 服务器使用的 .so 文件时,它崩溃了

c# - WPF 验证 (IDataErrorInfo) 和制表符聚焦问题

c# - MVC.net 2 - 更改 ValidationMessageFor 输出的 HTML - 这可以通过模板进行吗?

java - 循环错误信息

javascript - Apple.com 搜索喜欢 Transitions

将两个命令与管道组合