我正在阅读创建混合数据类型的“联合”应用程序之一。例子
typedef union {
int x;
float y;
}mix;
mix arr[100];
数组arr[100]
的每个元素都可以存储int
或float
类型的值。但是,假设我想从用户那里获取输入并将其存储在arr[ ]
中,并且我不知道任何一个用户都将输入float
或int
值。因此,我不知道应该选择以下哪条语句来存储用户的输入。
1。scanf ("%d",&arr[0].x);
OR
2。scanf ("%f",&arr[0].y);
当我要打印该值时,也会出现类似的问题。
我知道我可以使用“标记字段” 解决此问题。所以我可以做到
#include <stdio.h>
typedef union {
int x;
float y;
}mix;
mix arr[100];
int main ()
{
int k; // tag field
puts("Mention 1 if you want to enter integer and 0 if you want to enter float value");
scanf ("%d",&k);
if (k)
{
scanf ("%d",&arr[0].x);
printf ("%d is the entered integer value\n",arr[0].x);
}
else
{
scanf ("%f",&arr[0].y);
printf ("%f is the entered float value\n",arr[0].y);
}
}
但是这里用户告诉他要输入的数据类型(借助0或1)。我想知道:在C语言中,编译器是否可以通过任何方式自动检测用户输入的数据类型,并在没有用户帮助的情况下根据第1条或第2条scanf
语句运行? OR 库中是否存在用于执行此操作的预定义功能?
还告诉您是否有其他有趣的方式来执行此程序。
答案 0 :(得分:1)
我猜这可能对您有帮助...
float num;
printf("Enter number\n");
scanf("%f",&num);
if((num - (int)num)== 0) //(int)num : Type casting
printf("Entered number is of int type\n");
else
printf("Entered number is of float type\n");
答案 1 :(得分:1)
确定用户输入值的数据类型
读取为fgets()
行,并使用strtol(), strtof()
进行解析。
未经测试的代码,请阅读注释。
puts("Mention 1 if you want to enter integer and 0 if you want to enter float value");
char buffer[100];
if (fgets(buffer, sizeof buffer, stdin)) {
// OK we have an input line of text now as a string
buffer[strcspn(buffer, "\n")] = '\0'; // lop off potential \n
char *endptr;
errno = 0;
long lval = strtol(buffer, &endptr);
// If conversion occurred and no text at the end ...
if (endptr > buffer && *endptr == '\0') {
// An integer type!
if (errno == ERANGE) puts("Integer value out of range");
printf("Integer value: %ld\n", lval);
} else {
errno = 0;
float = strtof(buffer, &endptr);
if (endptr > buffer && *endptr == '\0') {
// A float
if (errno == ERANGE) puts("float value out of range");
printf("float value: %g\n", f);
} else
puts("Non-numeric input");
}
}
有关int mystrtoi(const char *str)
的信息,请参见ref code。