Проверьте, содержит ли массив [] массив значений типа int, float или double и сохраните значение для соответствующего типа данных. - PullRequest
0 голосов
/ 28 июня 2011

В программировании на C как проверить, содержит ли char array[] значение int, float или double, а также сохранить значение, используя соответствующий тип данных?

Пример:
Еслиchar array[] содержит 100 - его значение int и должно храниться в int a.если массив char содержит 10000.01 его значение float и должен храниться в float b.

Ответы [ 6 ]

2 голосов
/ 28 июня 2011

Единственный способ хранить смешанные типы в массиве - это иметь массив указателей.

Вам необходимо использовать структуру или объединение для хранения каждого из них, например, так:

#define TYPE_INT 1
#define TYPE_FLOAT 2
#define TYPE_STRING 3

typedef struct  {
  int type;
  void *ptr;
} object;

object* mkobject( int type, void * data ){
  object * obj = (object*)malloc(COUNT*sizeof(object))
  obj->type = type;
  obj->ptr = data;
  return obj;
}

При использовании вышеперечисленного вы не можете хранить информацию о типе

void * intdup( int original ) {
  int * copy = (int*) malloc(1*sizeof(int));
  *copy = original; 
  return (void*) copy;
}

void * floatdup( float original ) {
  float * copy = (float*) malloc(1*sizeof(float));
  *copy = original; 
  return (void*) copy;
}

int COUNT = 3;
objects** objectlist = (object**)malloc(COUNT*sizeof(object*))

// -- add things to the list
int a_number = 2243;
float a_float = 1.24;
char* a_string = "hello world"; 


objectlist[0] = mkobject( TYPE_STRING, strdup(a_string) );
objectlist[1] = mkobject( TYPE_INT, intdup(a_number) );
objectlist[2] = mkobject( TYPE_FLOAT, intdup(a_float) );


// iterate through a list

for ( int x = 0; x < COUNT; x++ ){

   switch( objectlist[x]->type ){

      case TYPE_STRING:
       printf("string [%s]\n",(char*) objectlist[x]->ptr );
       break;
      case TYPE_FLOAT:
       printf("float  [%f]\n", *(float*) objectlist[x]->ptr );
       break;
      case TYPE_INT:
       printf("int    [%d]\n", *(int*) objectlist[x]->ptr );
       break;
      default;
       printf("unintialized object\n");
       break;

   }

}
2 голосов
/ 28 июня 2011

Поскольку невозможно определить типы переменных во время выполнения, вам все равно нужно иметь переменные правильного типа данных, определенные во время компиляции.Если это не проблема, вы, вероятно, могли бы отсканировать строку и найти десятичные разделители, чтобы определить, является ли это значением с плавающей запятой или целым числом.Но, возможно, не самый надежный метод: -)

2 голосов
/ 28 июня 2011

В C, в отличие от других языков, вы должны определить тип переменной во время компиляции.Поэтому, если у вас есть переменная типа char (или массив char), у вас есть char, а не int, не float и не double.

1 голос
/ 28 июня 2011

Предположим, что число является числом с плавающей запятой и используйте strtod().

Если преобразование сработало, число может быть целым числом.Проверьте пределы и близость к правильному целому числу и преобразовайте снова, если все в порядке.

Псевдокод

char *input = "42.24";
char *err;
errno = 0;
double x = strtod(input, &err);
if (errno == 0) {
    /* it's (probably) a floating point value */
    if ((INT_MIN <= x) && (x <= INT_MAX)) {
        if (fabs(x - (int)x) < 0.00000001) {
            /* It's an integer */
            int i = x;
        }
    }
} else {
    /* deal with error */
}
1 голос
/ 28 июня 2011

Если вы храните значение типа:

"100.04"

в массиве символов или что-то в этом роде, вы можете сделать это, чтобы проверить, является ли число десятичным или нет:

double check = atof(theChar);

if (check % 1 > 0) {
    //It's a real number
}
else {
    //It's more specifically an integer
}

Если это то, что вы имеете в виду.Ваш вопрос немного неясен для меня.

Хотя на самом деле это не проверка типов, это просто тестирование, где есть десятичная дробь или нет ... Как другие говорили, что вы не можете сделать этопотому что символ * определяется во время компиляции, а не во время выполнения и не может быть изменен.

1 голос
/ 28 июня 2011

Я думаю, что вы хотите использовать союз (насколько я понимаю ваш ответ).

union {
   char a[4];
   float b;
   int c;
} dude;
// ...
union dude woah;
woah.a = "abc";
puts(a);
woah.b = 4.3;
printf("%f\n", woah.b);
woah.c = 456;
printf("%d\n", woah.c);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...