如何在c中检查用户输入的数据类型,如int、double和string
我试图检查用户输入的数据类型,可以是int、double、string/char等。以下是我的代码:如何在c中检查用户输入的数据类型,如int、double和string,c,C,我试图检查用户输入的数据类型,可以是int、double、string/char等。以下是我的代码: int main(void) { char input[100] = ""; double x; int num; char str[20] = ""; int assignments[5] = { 0 }; printf("Pls. provide unput"); fgets(input, 100, stdin); if (
int main(void)
{
char input[100] = "";
double x;
int num;
char str[20] = "";
int assignments[5] = { 0 };
printf("Pls. provide unput");
fgets(input, 100, stdin);
if (sscanf(input, "%d", &num) == 1)
{
printf("the input is a int.\n");
}
else if (strtod(input, NULL) != 0)
{
printf("the input is a double\n");
}
else if (sscanf(input, "%s", &str) == 1)
{
printf("the input is a string\n");
}
else
{
printf("input not recognized");
}
return 0;
}
但是它不能正常工作-特别是double
部分。对于double
的任何输入,它将其识别为int
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
int main()
{
char input[100] = "";
double x;
int num;
char str[20] = "";
int assignment[5] = {0};
double tolerance = 1e-12;
printf("Pls. provide input: ");
fgets(input, 100, stdin);
if (sscanf(input, "%lf", &x) == 1) {
// Is it a number? All integers are also doubles.
num = (int)x; // We cast to int.
if ( fabs(x - num)/x > tolerance ) {
printf("The input is a floating point\n");
} else {
printf("The input is a integer\n");
}
} else if (sscanf(input, "%s", str) == 1) {
// Check if it is string
printf("The input is a string\n");
} else {
// No match error.
printf("input not recognized\n");
}
}
样本
gcc测试c
请。提供输入:3输入是一个整数 请。提供输入:3.3
输入是一个浮点
注意您应该使用一些更有意义的东西,比如机器精度,而不是我显示的公差。毫不奇怪,代码会将浮点值的输入检测为
int
。例如,给定2.3
的输入,sscanf()
的%d
格式将把2
识别为int
,并在遇到小数点时停止。小数点将被随后的输入操作读取
尝试处理该字符串以检查该字符串包含的内容。可以使用的条件包括查找非数字字符(除数字、小数点或符号字符以外的任何字符)-如果找到这些字符,则将输入视为字符串。如果只找到数字和符号字符,但没有小数点,则将字符串解释为int
。如果找到了数字、符号和小数点,则解释为浮点
例如,如果希望将2.3E32
视为浮点而不是字符串,则还可以使用其他技术
您可以根据自己的需要,随心所欲地定制上述产品
然而,无论您做什么,都需要对每个操作(读取、解释字符串等)进行错误检查。你最好假设输入字符串包含垃圾,除非它通过了你的测试-默认情况下假设它包含一个整数可能会让你在输入时遇到麻烦,比如
2XYZ
@SouravGhosh integer可以正确地读作double
@BLUEPIXY我明白你的意思了,直截了当地说,但是如果您坚持使用abc.xyz
格式,则%d.%d
可以用于double.)双重身份为3.1e2
,inf
。@BLUEPIXY这就是我提到格式的原因:)strtod(“123”,&endp),endp-->'\0',但int。你一定看到过这个问题的一个非常早期的版本,它在第一个5分钟内就被修复了,以便看到scanf()
格式错误-问题历史记录中没有这方面的记录(但如果在添加评论之前已修复,则不会有记录)。好的,我已编辑以反映这一点。但是问题作者发布的原始代码仍然存在错误,他使用了&str而不是str。你提供的东西好多了。我不太确定最好做什么。像strtod()
和strtol()
这样的函数会告诉您它们停止转换的位置以及是否检测到错误,并且您可以使用结束位置扫描到行尾,以确保所有内容都已转换,然后您可以先尝试整数,然后再尝试双倍。但是,使用strtol()
和strtod()进行错误检测是一件棘手的事情,这是我还不确定它是否适合OP的一个主要原因。替代方案也很糟糕。也许转换规范有帮助?