gpt4 book ai didi

检查C中的输入类型

转载 作者:太空宇宙 更新时间:2023-11-04 00:59:55 24 4
gpt4 key购买 nike

我想检查我的输入是否为整数(例如不是字符或字符串)。我偶然发现了这段代码(有效):

#include <stdio.h>

int main (void)
{
float a;
int q;

printf("\nInsert number\t");
scanf("%f",&a);

q=(int)a;
++q;

if((q - a) != 1)
printf("\nThe number is not an integer\n\n");
else
printf("\nThe number is an integer\n\n");

return 0;
}

谁能解释一下它为什么有效?

最佳答案

I stumbled across this code (that works): ... why it works?

一般情况下,它不起作用。失败案例太多

给定的输入可能是单个字符 Z,下面的代码是未定义的行为 (UB) 因为 scanf() 没有赋值 一个。结果:(int)a 是 UB。

scanf("%f",&a);
q=(int)a;

给定的输入可能是“12345678901234567890”,超出 int 范围的东西,然后用 (int)a 转换也是 UB。

如果aINT_MAX的值,则++q;为UB。

输入可以精确表示为 int 而不是 float 的值会导致 OP 代码失败。

四舍五入为整数的输入,如 "0.99999999999999999999999999999" --> 1.0f OP 检测失败


备选方案。

scanf()、fgets() 不读取 C 字符串intfloat 等。相反,最好将它们视为读取 text 并将它们转换为 C 字符串intfloat

scanf() 中的f 表示格式化 输入,这是这里的未知部分。最好避免 scanf()

由于代码需要检测有关用户输入的各种信息,因此请使用 fgets() 读取 文本。然后使用 strtol()strtoll()strtoul() 等来查看输入是否适合目标类型。

// Check if input fits in a `long`
char buf[100];
if (fgets(buf, sizeof buf, stdin) == NULL) {
puts("End-of-file or input error");
} else {
char *endptr;
errno = 0;
long ivalue = strtol(buf, &endptr, 0);
if (buf == endptr) puts("Fail: no conversion");
else if (*endptr != '\n' && *endptr != '\0') puts("Fail: Extra junk");
else if (errno) puts("Fail: Overlfow");
else printf("Success: %ld\n", ivalue);
}

关于检查C中的输入类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44355344/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com