Определение типа данных введенного пользователем значения - PullRequest
0 голосов
/ 14 февраля 2019

Я читал одно из приложений «Союзов» по ​​созданию смешанных типов данных.Пример

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

Каждый элемент массива arr[100] может хранить значение типа int или float.Но предположим, что я хочу взять ввод от пользователя и сохранить его в arr[ ], и я не буду знать, будет ли пользователь вводить значение float или int.Так что я не знаю, какое утверждение из следующего я должен выбрать, чтобы сохранить этот ввод от пользователя.

1. scanf ("%d",&arr[0].x);

ИЛИ

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 без помощи пользователя? ИЛИ Есть ли в библиотеке предопределенная функция для этого?

Также скажите, есть ли у вас какой-нибудь другой интересный способ сделать эту программу.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Определение типа данных введенного пользователем значения

Чтение в виде строки 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) см. код ссылки .

0 голосов
/ 14 февраля 2019

Это может помочь вам, я думаю ...

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");
...