C语言中如何检查数组元素数据类型?如何校验元素为int且在1-42之间?
Hey there! Let’s break down your two C programming questions with practical, easy-to-implement solutions.
1. Checking the Data Type of Elements in an Array
First off, it’s critical to remember that standard C arrays are homogeneous—all elements share the same data type, which is fixed at compile time when you declare the array. For example, if you define int scores[10];, every element in scores is guaranteed to be an int; there’s no need to runtime-check this because the compiler enforces it.
If you’re working with a flexible setup (like storing mixed data types using void* pointers), you’ll need to add an explicit type tag to track each element’s type. Here’s a common approach using a struct:
#include <stdio.h> // Define an enum to track supported element types typedef enum { TYPE_INT, TYPE_FLOAT, TYPE_CHAR } ElementType; // Struct to hold both the value and its type typedef struct { ElementType type; void* value; } ArrayElement; int main() { int int_val = 25; float float_val = 12.34; char char_val = 'Z'; ArrayElement mixed_array[3] = { {TYPE_INT, &int_val}, {TYPE_FLOAT, &float_val}, {TYPE_CHAR, &char_val} }; // Check and print each element's type and value for (int i = 0; i < 3; i++) { switch (mixed_array[i].type) { case TYPE_INT: printf("Element %d is an int: %d\n", i, *(int*)mixed_array[i].value); break; case TYPE_FLOAT: printf("Element %d is a float: %.2f\n", i, *(float*)mixed_array[i].value); break; case TYPE_CHAR: printf("Element %d is a char: %c\n", i, *(char*)mixed_array[i].value); break; default: printf("Element %d has an unknown type\n", i); } } return 0; }
This setup lets you explicitly track and validate each element’s type at runtime.
2. Error Checking for Array Inputs (Type + Range Validation)
For your second question—ensuring inputs are valid int values between 1 and 42 before storing them—you’ll need to combine two checks:
- Type validation: Confirm the input is a proper integer.
- Range validation: Ensure the integer falls within 1–42.
Here’s a reusable example that handles both, plus cleanup of invalid input to avoid stuck loops:
#include <stdio.h> // Function to get a validated int between 1 and 42 int get_valid_input() { int num; int scan_result; while (1) { printf("Enter an integer (1-42): "); scan_result = scanf("%d", &num); // Check if input is a valid integer if (scan_result != 1) { printf("Oops, that's not an integer. Try again!\n"); // Clear the input buffer to avoid infinite loops while (getchar() != '\n'); continue; } // Check if value is within the required range if (num < 1 || num > 42) { printf("Error: Value must be between 1 and 42. Try again!\n"); continue; } // If we reach here, input is valid return num; } } int main() { int valid_array[5]; int array_length = sizeof(valid_array) / sizeof(valid_array[0]); printf("Let's fill the array with valid values:\n"); for (int i = 0; i < array_length; i++) { valid_array[i] = get_valid_input(); } // Print the final validated array printf("\nYour validated array:\n"); for (int i = 0; i < array_length; i++) { printf("Element %d: %d\n", i, valid_array[i]); } return 0; }
Key details:
scanf("%d", &num)returns the number of successfully matched items. A return value of 1 means a valid integer was read.while(getchar() != '\n')clears the input buffer after invalid entries—this preventsscanffrom repeatedly reading the same bad input.- The loop runs until the user provides a value that passes both checks, ensuring only valid data makes it into the array.
内容的提问来源于stack exchange,提问作者Patrick Whelan

