2

我需要将一个 int 或一个字符串传递给堆栈的推送函数。通常我只会重载该函数,并有一个接受字符串参数和一个接受 int 参数的函数,以便仅根据参数调用适当的函数。我在评论中写了我通常会包含该类型的位置。我只是被困在那里。

void push(Stack *S, /* int or a string */ element)
{        
    /* If the stack is full, we cannot push an element into it as there is no space for it.*/        
    if(S->size == S->capacity)        
    {                
        printf("Stack is Full\n");        
    }        
    else        
    {                
        /* Push an element on the top of it and increase its size by one*/ 

        if (/* element is an int*/)
            S->elements[S->size++] = element; 
        else if (/* element is a string */)
            S->charElements[S->size++] = element;
    }        
    return;
}
4

5 回答 5

3

在这种情况下,您可以使用 aunion并且它会自动为您管理事情:

typedef union {
   int integer; 
   char* string;
} Item;

或者如果仍然需要类型检查,您可以使用structwith type and unioninside:

typedef enum { INTEGER, STRING } Type;

typedef struct
{
  Type type;
  union {
  int integer;
  char *string;
  } value;
} Item;
于 2012-10-25T06:05:29.610 回答
1

如果你的编译器已经实现了 C11 的那部分,你可以使用新特性_Generic。例如,clang 已经实现了这一点,对于 gcc 和表兄弟,有一些方法可以模拟该特性:P99

它通常通过宏工作,像这样

#define STRING_OR_INT(X) _Generic((X), int: my_int_function, char const*: my_str_function)(X)
于 2012-10-25T07:03:34.767 回答
0

c中没有函数重载。

您可以将类型作为参数传递,使元素参数成为指针,然后将指针重新转换为适当的类型。

于 2012-10-25T06:01:31.323 回答
0

您必须仅使用以该语言提供的设施。我不认为有办法在 C 中检查变量是字符串还是 int。此外,元素不能同时保存字符串和 int 在这里要小心。所以去功能重载。祝你好运

于 2012-10-25T06:09:07.233 回答
0

你可以这样试试

void push (Stack *S,void *element)
    {
     (*element) //access using dereferencing of pointer by converting it to int
     element // incase of char array
    }

    //from calling enviroment
    int i =10;
    char *str="hello world"
    push(S,&i) //in case of int pass address of int
    push(S,str) // in case of char array
于 2012-10-25T06:10:50.387 回答