我需要将int或字符串传递给堆栈的push函数。通常我只是重载函数并有一个接受一个字符串参数和一个接受一个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;
}
答案 0 :(得分:3)
在这种情况下,您可以使用union
并自动为您管理内容:
typedef union {
int integer;
char* string;
} Item;
或者无论如何都需要进行类型检查,您可以使用struct
类型和union
内部:
typedef enum { INTEGER, STRING } Type;
typedef struct
{
Type type;
union {
int integer;
char *string;
} value;
} Item;
答案 1 :(得分:1)
如果您的编译器已经实现了C11的那部分,那么您可以使用新功能_Generic
。 clang,例如,已经实现了这个,对于gcc和cousins,有一些方法可以模拟该功能:P99
它通常通过宏工作,类似这样
#define STRING_OR_INT(X) _Generic((X), int: my_int_function, char const*: my_str_function)(X)
答案 2 :(得分:0)
c中没有函数重载。
您可以将类型作为参数传递,使元素参数成为指针,然后将指针重新转换为适当的类型。
答案 3 :(得分:0)
您必须使用仅使用该语言提供的功能。我不认为有一种方法来检查变量是否是C中的字符串或int。而且元素不能保存字符串和int在这里要小心。所以去功能重载。祝你好运
答案 4 :(得分: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