将类型发送到函数并读取特定数据类型

时间:2014-11-15 16:04:51

标签: c

第一个问题:我可以将该类型发送给函数吗? 例如,如果我编写适用于任何类型的泛型函数。

第二个问题: 我想编写一个函数来确保我读取以下数据类型之一: int,float,double,long long

如果我读了一个int:

,我希望它能如何工作
  1. 如果我进入" abcd"该函数将打印一条消息,要求输入有效的int号。
  2. 如果我进入" 123abc"该函数将打印一条消息,要求输入有效的int号。
  3. 唯一有效的案例是:

    1. 如果我进入" 123" 或
    2. 如果我输入" 123 456"在这种情况下,该函数将只读取缓冲区中第二个数字的第一个数字。
    3. 以下是此功能的代码:

      int citesteNumar(char mesaj[])
      {
          char c;
          int nr=0;
          int semn = 1;
          int cifre = 0;
          bool ok = false;
          while(1)
          {
              nr = 0;
              while(1)
              {
                  c = getchar();
                  if(c == ' ' && !ok)
                      continue;
                  if((((c < '0') || ('9' < c)) && (c != '-')) || (c == '\n'))
                  {
                      if(c != ' ')
                          fflush(stdin);
                      if((c != '\n') && (c != ' ') && ok)
                          ok = false;
                      break;
                  }
                  else if(c == '-')
                       {
                           if(!ok)
                              semn = -1;
                           else
                           {
                               fflush(stdin);
                               break;
                           }
                       }
                      else
                      {
                          nr = nr*10 + (c - '0');
                          ok = true;
                          cifre ++;
                          if(cifre == 10)
                              break;
                      }
              }
              if(!ok)
                  printf("%s",mesaj);
              else return semn*nr;
          }
          return -1; 
      }
      

      我可以写一个通用函数来读取这些类型: int,float,double,long long

      第一个无效的情况可以使用scanf函数返回的值来解决,但我不知道如何解决第二种情况(仅使用上述方法)。

      该功能需要便携。

2 个答案:

答案 0 :(得分:0)

不,您无法发送该类型,但您可以发送enum

typedef enum {
  MY_NONE,
  MY_INT,
  MY_FLOAT,
  MY_DOUBLE,
  MY_LL
} Mytype;

在您的功能中,使用enum上的开关。另外,在缓冲区上使用sscanf,并使用相应的格式。阅读int内部空白会让您感到麻烦;也许看看语言环境,你可能会找到解决方案。

答案 1 :(得分:0)

#include <stdio.h>
#include <stdlib.h>

#define PROC(type) \
    if(*endp){\
        printf("enter a valid " #type " number.\n");\
        return NULL;\
    }\
    if(ret = malloc(sizeof(v)))\
        *(type*)ret = v;\
    /**/

void *GetNumber(const char *type){
    void *ret = NULL;
    char temp[32], *endp;
    scanf("%31s", temp);
    if(strcmp("int", type)==0){
        int v = strtol(temp, &endp, 10);
        PROC(int)
    } else if(strcmp("long long", type)==0){
        long long v = strtoll(temp, &endp, 10);
        PROC(long long)
    } else if(strcmp("float", type)==0){
        float v = strtod(temp, &endp);
        PROC(float)
    } else if(strcmp("double", type)==0){
        double v = strtod(temp, &endp);
        PROC(double)
    }
    return ret;
}

int main(){
    int *vi;
    float *vf;
    while((vi = GetNumber("int")) == NULL)
        ;
    printf("%d\n", *vi);
    free(vi);
    if(vf = GetNumber("float"))
        printf("%f\n", *vf);
    free(vf);
    return 0;
 }