确定用户输入值的数据类型

时间:2019-02-14 04:57:10

标签: c structure union unions union-types

我正在阅读创建混合数据类型的“联合”应用程序之一。例子

typedef union {
int x;
float y;
}mix;
mix arr[100];

数组arr[100]的每个元素都可以存储intfloat类型的值。但是,假设我想从用户那里获取输入并将其存储在arr[ ]中,并且我不知道任何一个用户都将输入floatint值。因此,我不知道应该选择以下哪条语句来存储用户的输入。

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 库中是否存在用于执行此操作的预定义功能?

还告诉您是否有其他有趣的方式来执行此程序。

2 个答案:

答案 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