当前位置: 首页 > article >正文

C语言经典面试题目(十六)

1、什么是C语言中的指针常量和指针变量?它们有什么区别?

在C语言中,指针常量和指针变量是指针的两种不同类型。它们的区别在于指针的指向和指针本身是否可以被修改。

  1. 指针常量:指针指向的内存地址不可变,但指针本身的值(即指针变量)可以变化。一旦指针被初始化为某个地址,就无法修改它指向的地址,但可以改变指针的值为其他地址。

    int *const ptr; // ptr是一个指针常量,指向int类型的数据
    int x = 10;
    ptr = &x; // 合法,初始化ptr为x的地址
    *ptr = 20; // 合法,通过ptr修改x的值为20
    
  2. 指针变量:指针指向的内存地址和指针本身的值都可以变化。可以通过指针变量来修改指针指向的地址,也可以修改指针本身的值。

    int *ptr; // ptr是一个指针变量,指向int类型的数据
    int x = 10;
    ptr = &x; // 合法,初始化ptr为x的地址
    int y = 20;
    ptr = &y; // 合法,修改ptr的值为y的地址
    

2、如何在C语言中实现字符串的查找和替换操作?

在C语言中,可以使用标准库函数来实现字符串的查找和替换操作。常用的函数包括:

  1. strstr:用于在字符串中查找子串的出现位置。
  2. strchr:用于在字符串中查找特定字符的出现位置。
  3. strrchr:用于在字符串中查找特定字符的最后一次出现位置。
  4. strtok:用于分割字符串为多个子串。
  5. strcspn:用于查找字符串中第一个不包含在指定字符集合中的字符的位置。

以下是一个简单的示例,演示了如何实现字符串的查找和替换操作:

#include <stdio.h>
#include <string.h>

int main() {
    char str[] = "hello world";
    char *ptr = strstr(str, "world");
    if (ptr != NULL) {
        printf("Substring found at position: %ld\n", ptr - str);
    } else {
        printf("Substring not found\n");
    }

    char newStr[] = "goodbye";
    strncpy(ptr, newStr, strlen(newStr)); // 替换字符串
    printf("Modified string: %s\n", str);

    return 0;
}

3、C语言中的函数指针数组有什么作用?请举例说明。

函数指针数组用于存储多个函数指针,使得可以根据需要动态选择调用哪个函数。常见的应用场景包括菜单选择、回调函数等。

以下是一个示例,演示了如何使用函数指针数组实现菜单选择:

#include <stdio.h>

void func1() {
    printf("You selected option 1\n");
}

void func2() {
    printf("You selected option 2\n");
}

void func3() {
    printf("You selected option 3\n");
}

int main() {
    void (*menu[3])() = {func1, func2, func3}; // 函数指针数组
    int choice;
    printf("Enter your choice (1-3): ");
    scanf("%d", &choice);
    if (choice >= 1 && choice <= 3) {
        menu[choice - 1](); // 调用选择的函数
    } else {
        printf("Invalid choice\n");
    }
    return 0;
}

4、C语言中的文件读写模式有哪些?请列举几个常用的文件读写模式。

C语言中常用的文件读写模式包括:

  1. “r”:只读模式,文件必须存在,指针位于文件开头。
  2. “w”:写入模式,文件不存在时创建新文件,文件存在时清空文件内容,指针位于文件开头。
  3. “a”:追加模式,文件不存在时创建新文件,文件存在时保留原内容,在文件末尾添加新内容,指针位于文件末尾。
  4. “r+”:读写模式,文件必须存在,指针位于文件开头。
  5. “w+”:读写模式,文件不存在时创建新文件,文件存在时清空文件内容,指针位于文件开头。
  6. “a+”:读写模式,文件不存在时创建新文件,文件存在时保留原内容,在文件末尾添加新内容,指针位于文件末尾。

5、如何在C语言中实现哈夫曼树数据结构?

哈夫曼树是一种经典的数据结构,用于实现最优编码。在C语言中,可以通过二叉树的方式实现哈夫曼树。哈夫曼树的构建通常是通过构建哈夫曼树的算法来实现的,其中最常见的是哈夫曼编码算法。

以下是一个简单的示例,演示了如何实现哈夫曼树的构建:

#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int frequency;
    char data;
    struct Node *left;
    struct Node *right;
} Node;

Node *createNode(int frequency, char data) {
    Node *node = (Node *)malloc(sizeof(Node));
    node->frequency = frequency;
    node->data = data;
    node->left = NULL;
    node->right = NULL;
    return node;
}

void printTree(Node *root) {
    if (root != NULL) {
        printf("%c(%d) ", root->data, root->frequency);
        printTree(root->left);
        printTree(root->right);
    }
}

int main() {
    Node *node1 = createNode(5, 'a');
    Node *node2 = createNode(10, 'b');
    Node *node3 = createNode(15, 'c');
    Node *node4 = createNode

(20, 'd');
    Node *node5 = createNode(25, 'e');
    Node *node6 = createNode(30, 'f');

    node5->left = node1;
    node5->right = node2;
    node6->left = node3;
    node6->right = node4;

    Node *root = createNode(node5->frequency + node6->frequency, '*');
    root->left = node5;
    root->right = node6;

    printf("Huffman tree: ");
    printTree(root);
    printf("\n");

    return 0;
}

在上面的示例中,创建了几个节点表示字符和频率,然后根据哈夫曼算法构建了哈夫曼树,并打印了该哈夫曼树的结构。


http://www.kler.cn/a/274788.html

相关文章:

  • 后端使用Spring Boot框架 + 前端VUE 实现滑动模块验证码
  • 多屏幕编程时用pygame指定窗口出现在第二块显示器上的方法
  • 南城云趣:智能云平台,杜绝电动车充电安全隐患
  • SparkSQL案例
  • 如何去设计一个消息队列
  • 排序算法(3)——归并排序、计数排序
  • 选数异或 (AcWing 4645)
  • 设计模式学习笔记 - 规范与重构 - 8.实践:程序出错返回啥?NULL、异常、错误吗、空对象?重构ID生成器,处理各函数的异常
  • 国内外15款AI搜索引擎汇总
  • 选择排序算法(Selection Sort)原理及实现
  • 基于Spring Boot+Vue的智慧图书管理系统
  • 【使用xlrd、xlutils读写excel】
  • Devops-01-devops 是什么?
  • 自动化单元测试 Automatic Test Generation
  • 漫谈微服务网关
  • 性能优化(CPU优化技术)-NEON指令详解
  • 服务器版本命令查看
  • Http的缓存有哪些
  • 前端项目,个人笔记(五)【图片懒加载 + 路由配置 + 面包屑 + 路由行为修改】
  • k8s详细教程
  • QT 驾校系统界面布局编写
  • ES集群和分片以及脑裂
  • 竞争优势:大型语言模型 (LLM) 如何重新定义业务策略
  • DOM节点操作
  • LVGL:拓展部件——键盘 lv_keyboard
  • Spring MVC入门(4)