练习 C:构建一个简单的电话簿应用程序

练习 c:构建一个简单的电话簿应用程序

学习C语言编程的最佳途径之一就是动手实践。本文将带您逐步完成一个我最近完成的项目:一个简单的电话簿应用程序。此应用演示了C语言中的文件处理和基本数据管理,允许您添加、查看和删除联系人。

代码详解

以下是完整代码:

#include #include // 函数声明void addcontact(char name[], char number[]);void viewcontacts();void deletecontact(char name[]);int main() {    int choice;    char name[20];    char number[20];    printf("-- 欢迎使用您的电话簿! -- n");    do {        // 显示菜单        printf("n您想执行什么操作?n");        printf("1. 创建新联系人t 2. 查看电话簿t 3. 删除联系人t 4. 退出n");        scanf("%d", &choice);        switch (choice) {            case 1:                // 添加新联系人                printf("很好,让我们创建一个新联系人:n");                printf("请输入联系人的姓名:n");                scanf("%s", name);                printf("现在输入电话号码:n");                scanf("%s", number);                addcontact(name, number);                break;            case 2:                // 查看电话簿                printf("这是您的电话簿:n");                viewcontacts();                break;            case 3:                // 删除联系人                printf("请输入要删除的联系人的姓名:n");                scanf("%s", name);                deletecontact(name);                break;        }    } while (choice != 4); // 循环直到用户选择“退出”    return 0;}// 向电话簿添加联系人的函数void addcontact(char name[], char number[]) {    FILE *pfile;    pfile = fopen("phonebook.txt", "a");    if (pfile == NULL) {        printf("打开电话簿失败。");        return;    }    fprintf(pfile, "姓名: %s t 电话: %sn", name, number);    printf("联系人已创建!n");    fclose(pfile);}// 查看电话簿中所有联系人的函数void viewcontacts() {    char filecontent[200];    FILE *pfile;    pfile = fopen("phonebook.txt", "r");    while (fgets(filecontent, sizeof(filecontent), pfile)) {        printf("n%s", filecontent);    }    fclose(pfile);    }// 从电话簿中删除联系人的函数void deletecontact(char name[]) {    FILE *pfile, *ptrash;    char line[200], contactname[20], contactnumber[20];    pfile = fopen("phonebook.txt", "r");    ptrash = fopen("trash.txt", "w");    if (pfile == NULL || ptrash == NULL) {        printf("打开文件失败。");        return;    }    while (fgets(line, sizeof(line), pfile)) {        sscanf(line, "姓名: %s t 电话: %sn", contactname, contactnumber);        if (strcmp(name, contactname) != 0) {            fputs(line, ptrash);        }    }    fclose(pfile);    fclose(ptrash);    // 将旧电话簿替换为更新后的版本    remove("phonebook.txt");    rename("trash.txt", "phonebook.txt");    printf("联系人已删除。");}

项目特点

该程序实现了三个核心功能:

添加联系人:允许用户输入姓名和电话号码。将联系人信息存储到名为 phonebook.txt 的文件中。查看联系人:读取并显示 phonebook.txt 文件中存储的所有联系人信息。删除联系人:根据用户输入的姓名删除联系人。通过创建临时文件过滤掉已删除的联系人,然后替换原始文件。

学习收获

通过这个练习,我巩固了以下C语言知识:

文件处理: 熟练运用 fopenfclose 等文件操作函数,并处理文件打开失败的情况。字符串操作: 使用 strcmpsscanf 等函数进行字符串比较和解析。基本数据管理: 学习如何在简单的文本文件中存储和管理数据,以及通过创建临时文件来更新文件内容。

代码测试

将代码复制到 .c 文件中(例如 phonebook.c),并使用C编译器(如 GCC)编译:

gcc -o phonebook phonebook.c

运行编译后的程序:

./phonebook

按照屏幕提示添加、查看或删除联系人。打开 phonebook.txt 文件验证数据是否正确存储。

未来改进

这个程序是一个良好的开端,未来可以考虑以下改进:

输入验证: 验证电话号码的有效性(例如,只包含数字),防止重复姓名。用户界面改进: 提供更清晰的提示信息,允许输入包含多个单词的姓名(使用 fgets 代替 scanf)。增强文件处理: 考虑数据加密以提高安全性,使用更结构化的文件格式(如 CSV 或 JSON)。高级功能: 添加搜索功能,按字母顺序排序联系人。

总结

这个练习帮助我深入理解了C语言的文件处理和基本数据管理。这是一个简单但实用的程序,可以作为更复杂项目的基础。如果您是C语言初学者,强烈推荐您尝试一下!这是一个有趣且有益的学习过程。

以上就是练习 C:构建一个简单的电话簿应用程序的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1461389.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月18日 13:18:58
下一篇 2025年12月18日 13:19:03

相关推荐

  • 如何保护您的 API 免受未经授权的请求

    API是现代应用的核心,连接着不同的系统。然而,它们也容易遭受未授权访问和恶意利用。保护API需要多重安全策略,包括CORS验证、强身份验证和实时监控。本文将介绍几种方法,确保只有可信客户端才能访问您的API。 1. 正确配置CORS 跨域资源共享(CORS)是关键的安全机制,它控制哪些来源可以与您…

    2025年12月18日
    000
  • 堆栈框架和功能调用:如何创建CPU开销

    我痴迷于计算机科学与软件工程的方方面面,尤其对底层编程情有独钟。探索软件与硬件的交互机制,分析其边界行为,着实令人着迷。即使在高级应用编程中,这些知识也能帮助调试和解决问题,例如堆栈内存的运用。理解堆栈内存的工作原理,特别是与硬件交互时,对于避免和调试问题至关重要。 本文将探讨程序中频繁的函数调用如…

    2025年12月18日
    000
  • 分配C中的字符串

    让我们来分析一下这两段C语言代码,看看为什么它们的行为差异如此之大。 代码示例一: #include <stdio.h>int main(void){ char *string = "wello, world!"; string[0] = ‘h’; puts(stri…

    2025年12月18日
    000
  • libv是两个

    我开发了一个名为Lua-Libuv的项目,并乐于分享我的经验。项目初衷是探索如何利用Libuv(一个用C语言编写的异步I/O库)构建简单的HTTP服务器,而无需深入掌握C语言。 借助ChatGPT的辅助,我完成了HTTP.C的基础代码。在处理持久连接时,我成功实现了在适当的时机关闭连接并释放资源。起…

    好文分享 2025年12月18日
    000
  • 独特的共享库问题

    问题描述 最近尝试链接一个自行构建的C语言共享库到本地项目时,遇到链接错误,提示“未定义的引用”。错误信息如下: /bin/ld: /tmp/cchb7mj8.o: in function `sdl_main’:main.c:(.text+0x3c): undefined reference to …

    2025年12月18日
    000
  • C ++程序员&#s未定义行为指南

    探索c语言编程的未定义行为:一本详尽指南 本文介绍一本关于C语言编程中未定义行为的电子书,共12章,涵盖了C语言编程中一些最棘手和鲜为人知的方面。本书并非C语言入门教材,而是面向熟悉C语言编程的读者,深入探讨未定义行为的各种情况及其潜在后果。作者Dmitry Sviridkin,编辑Andrey K…

    2025年12月18日
    000
  • Meson:使用无中造成的GIT项目作为依赖

    meson项目依赖处理:巧妙解决无meson.build文件的git项目依赖问题 许多优秀的Git项目缺乏Meson.build文件,这给使用Meson构建系统的开发者带来了挑战。本文将介绍一种方法,通过创建补丁文件来解决这个问题,并成功将一个没有Meson.build文件的Git项目作为子项目添加…

    2025年12月18日
    000
  • C IS中的C测试覆盖范围会教您如何使用

    软件测试覆盖率:确保代码质量的关键 在软件开发中,测试至关重要,它确保软件按预期运行。而测试覆盖率则进一步保证了测试的全面性,确保代码的各个分支和路径都被测试到。许多现代编程语言都提供库或工具来生成测试覆盖率报告,但您知道C语言也有一个“本地”工具吗? 让我们从一个简单的C函数开始,该函数返回±42…

    2025年12月18日
    000
  • 网络服务安装

    推介会: 本 SAE(业务学习情况)项目旨在开发一个基于客户端-服务器架构的实时“CAT”网络讨论应用程序。该应用允许多个客户端连接到中央服务器并进行实时通信。下图概述了套接字功能: 资源配置: 编程语言:C 语言版本控制:使用分布式 Github 进行代码共享开发环境:Visual Studio …

    2025年12月18日
    000
  • c语言函数声明的格式

    C语言函数声明以”返回值类型 函数名(参数列表)”组成,但细节丰富。参数修饰符const可防止参数修改,返回类型可为结构体、指针等。函数指针用于实现回调函数等。函数声明不仅说明函数存在,也定义接口,以进行类型检查并防止错误。 C语言函数声明:那些你可能不知道的细节 很多初学者…

    2025年12月18日
    000
  • 4 种最值得学习的 ackend 编程语言

    2024 年软件开发领域五大顶级后端编程语言:专家解读与未来趋势 后端编程是任何应用程序的基石,它支撑着 API、数据库、服务器和底层逻辑等不可见组件的运行,确保应用程序的流畅运作。面对众多后端编程语言,选择合适的语言可能令人困惑,因为每种语言都有其独特的优势和不足。 在深入探讨值得关注的顶级后端语…

    2025年12月18日
    000
  • c语言ll和&&的运算怎么用

    && 和 || 运算符具有短路求值特性:&&:当第一个操作数为假则返回假,跳过第二个操作数计算。||:当第一个操作数为真则返回真,跳过第二个操作数计算。短路特性可避免对产生副作用的表达式的无意义调用,提高效率,防止空指针错误。但使用应考虑副作用,必要时禁用短路。 C语…

    2025年12月18日
    000
  • c语言函数最大公约数最小公倍数是什么

    C语言中,可以使用辗转相除法高效计算最大公约数和最小公倍数。GCD函数采用递归实现,初始处理负数和零,随后不断更新最大公约数,直至余数为零。LCM函数利用GCD函数计算,其为两数乘积除以GCD。为避免整数溢出,使用long long类型。迭代版本的GCD函数避免递归,提高稳定性。常见错误包括未处理负…

    2025年12月18日
    000
  • c语言函数声明和调用的区别 什么是c语言函数声明和调用

    C语言函数声明告知编译器函数的存在和参数类型,而调用执行函数代码。函数声明中参数类型必须明确,声明和定义中的参数类型必须匹配。参数传递以值传递方式进行,修改函数内参数值不影响函数外参数值。返回值类型应与声明一致,忽略返回值或不匹配会导致错误。为优化性能,避免传递大型数据结构或过多调用函数,并遵循良好…

    2025年12月18日
    000
  • c语言函数声明参数类型有哪些?

    理解函数声明中参数类型是撰写高效 C 代码的关键。参数类型标识了函数接受的数据类型,决定了编译器检查和处理函数调用时的行为,还影响内存管理和执行效率。常见的用法包括传递简单数据类型和使用指针修改外部变量。常见的错误包括参数类型不匹配和忘记使用 const 关键字保护常量数据。为了优化性能,请传递数据…

    2025年12月18日
    000
  • c语言函数的定义和调用规则是什么

    C语言函数是可重复使用的代码块,就像乐高积木一样,可用于构建复杂程序。它们包含函数定义(返回类型、函数名、参数列表、函数体)和函数调用(使用预先定义的代码块)。参数传递有值传递和指针传递两种方式,取决于需求。函数原型声明在调用函数前提前定义其接口,有助于避免错误。函数的核心价值在于代码重用和模块化,…

    2025年12月18日
    000
  • c语言函数格式字母大小写转换步骤

    C语言不支持运行时函数名大小写转换,因为编译器在编译时根据大小写差异识别不同函数。然而,可以通过转换函数名的字符串表示来实现大小写转换,例如使用 toupper 和 tolower 函数。需要注意的是,字符串转换不会改变函数在编译器符号表中的实际绑定,因此仅用于显示或字符串处理目的。最佳实践建议在设…

    2025年12月18日
    000
  • c语言函数返回值的类型有哪些?返回值是由什么决定的?

    C语言函数返回值类型涵盖所有基本数据类型、指针类型以及自定义结构体等,由函数的设计目的决定。当返回指针时,需注意内存管理,确保返回的是动态分配或静态内存地址。使用自定义类型返回值需考虑数据复制开销,可使用指针传递进行优化。C语言中返回值常用于表示函数执行结果,可结合全局变量或其他机制进行更复杂的错误…

    2025年12月18日
    000
  • c语言函数返回值在内存保存在哪里?

    C语言函数返回值内存位置取决于类型、编译器优化和目标架构:小型值(int、char、float)通常保存在寄存器中。大型值(struct、数组)通常保存在栈上。避免返回过大结构体,可使用指针或堆内存管理。编译器优化策略和代码分析对于理解返回值位置至关重要。 C语言函数返回值的内存秘辛:栈、寄存器与你…

    2025年12月18日
    000
  • c语言函数的嵌套调用和递归调用区别是什么

    函数嵌套调用类似于乐队演奏,多个函数有序调用,清晰易懂。递归调用像回声,函数自调用,直到满足终止条件,功能强大但容易出错,需注意设置终止条件和栈溢出风险。 函数的嵌套与递归:一场代码的二重奏 很多初学者会把函数嵌套调用和递归调用搞混,觉得它们长得差不多,其实不然。这就好比小提琴和钢琴,虽然都是乐器,…

    2025年12月18日
    000

发表回复

登录后才能评论
关注微信