Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <ctype.h>
- typedef enum {
- INT,
- DOUBLE,
- CHAR,
- STRING,
- UNKNOWN
- } DataType;
- typedef struct {
- union {
- int i;
- double d;
- char c;
- char* s;
- } data;
- DataType type;
- } Data;
- typedef struct {
- Data x;
- Data y;
- } Point;
- // Function to detect data type
- DataType detect_type(void *value, char *input) {
- if (isdigit(input[0]) || (input[0] == '-' && isdigit(input[1]))) {
- if (strchr(input, '.')) {
- return DOUBLE;
- }
- return INT;
- } else if (strlen(input) == 1) {
- return CHAR;
- } else if (strchr(input, '\"')) {
- // Assuming strings are wrapped in quotes
- return STRING;
- }
- return UNKNOWN;
- }
- // Function to set data based on detected type
- void set_data(Data *data, char *input) {
- switch(detect_type(NULL, input)) {
- case INT:
- data->data.i = atoi(input);
- data->type = INT;
- break;
- case DOUBLE:
- data->data.d = atof(input);
- data->type = DOUBLE;
- break;
- case CHAR:
- data->data.c = input[0];
- data->type = CHAR;
- break;
- case STRING:
- data->data.s = strdup(input + 1); // Skip the opening quote
- data->data.s[strlen(data->data.s) - 1] = '\0'; // Remove the closing quote
- data->type = STRING;
- break;
- default:
- data->type = UNKNOWN;
- break;
- }
- }
- void print_data(Data data) {
- switch (data.type) {
- case INT:
- printf("%d", data.data.i);
- break;
- case DOUBLE:
- printf("%f", data.data.d);
- break;
- case CHAR:
- printf("%c", data.data.c);
- break;
- case STRING:
- printf("%s", data.data.s);
- break;
- default:
- printf("Unknown type");
- }
- }
- void print_point(Point p) {
- printf("p.x = ");
- print_data(p.x);
- printf(", p.y = ");
- print_data(p.y);
- printf("\n");
- }
- Point mixup(Point self, Point other) {
- Point result;
- result.x = self.x;
- result.y = other.y;
- return result;
- }
- int main() {
- Point p1;
- set_data(&p1.x, "5");
- set_data(&p1.y, "10.4");
- Point p2;
- set_data(&p2.x, "\"Hello\""); // Quotes needed for string detection
- set_data(&p2.y, "c");
- Point p3 = mixup(p1, p2);
- print_point(p3);
- // Clean up allocated string memory
- if (p2.x.type == STRING) {
- free(p2.x.data.s);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment