MST

星途 面试题库

面试题:C语言结构体数组的复杂操作与内存管理

编写一个C程序,实现以下功能:定义一个结构体,结构体中有一个指向动态分配的字符数组的指针(用于存储字符串)和一个整型成员。创建一个结构体数组,从用户处获取输入来填充结构体数组,输入的字符串长度不确定。之后对结构体数组中的字符串按字典序进行排序,排序后释放所有动态分配的内存。要求代码健壮,对内存分配失败等异常情况有合理处理。
10.9万 热度难度
编程语言C

知识考点

AI 面试

面试题答案

一键面试
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 定义结构体
typedef struct {
    char *str;
    int num;
} MyStruct;

// 比较函数,用于qsort进行字典序比较
int compare(const void *a, const void *b) {
    MyStruct *structA = (MyStruct *)a;
    MyStruct *structB = (MyStruct *)b;
    return strcmp(structA->str, structB->str);
}

int main() {
    int n;
    printf("请输入结构体数组的大小: ");
    if (scanf("%d", &n) != 1) {
        fprintf(stderr, "输入错误\n");
        return 1;
    }

    MyStruct *arr = (MyStruct *)malloc(n * sizeof(MyStruct));
    if (arr == NULL) {
        fprintf(stderr, "内存分配失败\n");
        return 1;
    }

    for (int i = 0; i < n; i++) {
        char temp[100];
        printf("请输入第 %d 个字符串: ", i + 1);
        if (scanf("%99s", temp) != 1) {
            fprintf(stderr, "输入错误\n");
            for (int j = 0; j < i; j++) {
                free(arr[j].str);
            }
            free(arr);
            return 1;
        }
        arr[i].str = (char *)malloc((strlen(temp) + 1) * sizeof(char));
        if (arr[i].str == NULL) {
            fprintf(stderr, "内存分配失败\n");
            for (int j = 0; j < i; j++) {
                free(arr[j].str);
            }
            free(arr);
            return 1;
        }
        strcpy(arr[i].str, temp);

        printf("请输入第 %d 个整数: ", i + 1);
        if (scanf("%d", &arr[i].num) != 1) {
            fprintf(stderr, "输入错误\n");
            free(arr[i].str);
            for (int j = 0; j < i; j++) {
                free(arr[j].str);
            }
            free(arr);
            return 1;
        }
    }

    qsort(arr, n, sizeof(MyStruct), compare);

    printf("排序后的结果:\n");
    for (int i = 0; i < n; i++) {
        printf("字符串: %s, 整数: %d\n", arr[i].str, arr[i].num);
        free(arr[i].str);
    }
    free(arr);

    return 0;
}