C primer plus (第六版)第十一章 编程练习第5,6题

题目:

5.设计并测试⼀个函数,搜索第1个函数形参指定的字符串,在其中查找第2个函数形参指定的字符⾸次出现的位置。如果成功,该函数返指向该字符的指针,如果在字符串中未找到指定字符,则返回空指针(该函数的功能与strchr()函数相同)。在⼀个完整的程序中测试该函数,使⽤⼀个循环给函数提供输⼊值。
6.编写⼀个名为is_within()的函数,接受⼀个字符和⼀个指向字符串的指针作为两个函数形参。如果指定字符在字符串中,该函数返回⼀个⾮零值(即为真)。否则,返回0(即为假)。在⼀个完整的程序中测试该函数,使⽤⼀个循环给函数提供输⼊值。

分析:

第5题和第6题类似,主要区别在于返回值不同,其中第6题需要函数返回值类似布尔值,第5题的函数返回值在如果找到字符的情况下返回字符指针,否则返回NULL空指针,同时第6题可以找到官方编程练习答案,第六题贴官方答案,第5题贴自己编写的答案(有问题)以及AI优化后的答案。

思路:

需要用到教程中的s_gets()函数用于字符串的输入,同时用scanf()函数或getchar()函数用于单个字符的输入,用教程中的类似的指针递增逐个字符比较的办法( *str == ch, str++ );

第5题代码(自编)

#include <stdio.h>
#include <string.h>
#define MAXLEN 20
char * charsrc(char * str, char ch);    //按照题目要求建立函数
char * s_gets(char * str, int n);       //测试程序用的用于获取测试字符串的函数int main()
{char source_string[MAXLEN];         //测试用字符串char search_ch;                     //目标字符变量char * charsrc_result;              //接住函数返回的指针puts("Please input a string.");     //测试用字符串输入if (s_gets(source_string, MAXLEN) == NULL){puts("Please re-input a string for test.");s_gets(source_string, MAXLEN);}puts("Please input character you want to search.");while (scanf("%c", &search_ch)){if ((charsrc_result = charsrc(source_string, search_ch)) != NULL){printf("Find the character %c inside string.\n", search_ch);printf("The pt of character is %p \n", &charsrc_result);puts(charsrc_result);break;       }if ((charsrc_result = charsrc(source_string, search_ch)) == NULL){puts("Can't find the character inside the string.");break;}}return 0;
}char * s_gets(char * st, int n)
{char * ret_val;int i = 0;ret_val = fgets(st, n, stdin); //调用fgets读取字符串if(ret_val)  // 仅当fgets成功读取时执行{// 找到换行符或字符串结束符的位置while (st[i] != '\n' && st[i] != '\0')i++;// 情况1:如果找到换行符,将其替换为字符串结束符\0if (st[i] == '\n')st[i] = '\0';// 情况2:如果没找到换行符(说明输入过长,缓冲区有残留)else// 清空输入缓冲区中剩余的字符(直到读到换行符)while (getchar() != '\n')continue;}
}char * charsrc(char * str, char ch)     //在一个字符串中搜索一个字符的函数
{while (*str != '\0'){str++;if (*str != '\0'){if (*str == ch){return str;break;}}else if (*str == '\0'){return NULL;break;}}
}

第5题代码,AI 优化后

#include <stdio.h>
#include <string.h>
#define MAXLEN 20char * charsrc(char * str, char ch);    // 查找字符的函数
char * s_gets(char * str, int n);       // 获取字符串的函数int main()
{char source_string[MAXLEN];         // 测试用字符串char search_ch;                     // 目标字符变量char * charsrc_result;              // 函数返回的指针puts("Please input a string.");     // 输入测试字符串if (s_gets(source_string, MAXLEN) == NULL){puts("Input error!");return 1;}puts("Please input character you want to search.");if (scanf("%c", &search_ch) != 1)   // 读取目标字符{puts("Input error!");return 1;}// 清理输入缓冲区中的换行符while (getchar() != '\n')continue;charsrc_result = charsrc(source_string, search_ch);if (charsrc_result != NULL){printf("Find the character '%c' in the string.\n", search_ch);printf("The address of the character is %p \n", (void *)charsrc_result);printf("The substring starting from this character: %s\n", charsrc_result);}else{printf("Can't find the character '%c' in the string.\n", search_ch);}return 0;
}// 读取字符串,处理换行符和缓冲区
char * s_gets(char * st, int n)
{char * ret_val;int i = 0;ret_val = fgets(st, n, stdin);if(ret_val)  // 仅当fgets成功读取时执行{// 找到换行符或字符串结束符的位置while (st[i] != '\n' && st[i] != '\0')i++;// 如果找到换行符,将其替换为字符串结束符if (st[i] == '\n')st[i] = '\0';// 如果没找到换行符,清空输入缓冲区elsewhile (getchar() != '\n')continue;}return ret_val;  // 增加返回值
}// 在字符串中搜索字符,返回首次出现的位置指针
char * charsrc(char * str, char ch)
{// 遍历字符串,包括第一个字符while (*str != '\0'){if (*str == ch){return str;  // 找到字符,返回当前指针}str++;  // 移动到下一个字符}return NULL;  // 未找到字符
}

第6题代码,原书答案

#include <stdio.h>
#include <string.h>
#define LEN 80
_Bool is_within(const char *str, char c);
char * s_gets(char * st, int n);int main()
{char input[LEN];char ch;int found;puts("Enter a string:");while(s_gets(input, LEN) && input[0] != '\0'){puts("Enter a character:");ch = getchar();while (getchar() != '\n')continue;found = is_within(input, ch);if (found == 0)printf("%c not found in string.\n", ch);elseprintf("%c found in string %s\n",ch, input);puts("Next string:");}puts("Done.\n");return 0;
}char * s_gets(char * st, int n)
{char * ret_val;char * find;ret_val = fgets(st, n, stdin);if(ret_val){find = strchr(st, '\n');if(find)*find = '\0';elsewhile (getchar() != '\n')continue;}return ret_val;
}_Bool is_within(const char * str, char ch)
{while (*str != ch && *str != '\0')  str++;return *str;        //如果没找到字符,*str == '\0'指向字符串末尾,返回0,否则返回非0值
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/96797.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/96797.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Altium Designer(AD)PCB丝印批量修改

目录 1 Altium Designer(AD)PCB丝印的字体批量修改 1.1选中所有丝印 1.1.1选中一个丝印:鼠标左键点击 1.1.2查找相似对象:鼠标右键或快捷键N 1.1.3如下图所示丝印被全部选中 1.2丝印字体信息修改 1.2.1打开属性面板——>位置/属性/字体修改 1.2.2丝印字体修改 1.2.…

AI+华为HarmonyOS开发工具DevEco Studio详细安装指南

作者&#xff1a;长江支流 日期&#xff1a;2025-09-13 第一部分&#xff1a;AI工具使用 一、如何使用DeepSeek帮助自己的工作&#xff1f; &#xff08;一&#xff09;提示词 为了与时俱进&#xff0c;充分利用最新技术、提高效率&#xff0c;采用AI生成部分材料&#xf…

【Ambari监控】— API请求逻辑梳理

附录&#xff1a;完整内容和源代码下载请参照 https://doc.janettr.com/ 一、前序章节回忆 我们在前面章节拆解了 Collector 的启动过程&#xff0c;并定位了控制器 TimelineWebServices。 本节聚焦 Collector 对外暴露的 REST 服务&#xff0c;搭建「接口全景图」。 二、接口…

论文阅读 2025-9-13 论文阅读随心记

随便记录一下最近阅读的几篇论文 1. Does DINOv3 Set a New Medical Vision Standard? 第一章 动机 (Motivation) 自然图像领域的成功范式&#xff1a;大型语言模型&#xff08;LLMs&#xff09;和视觉基础模型&#xff08;如 DINO 系列&#xff09;证明&#xff0c;通过自监督…

Avalonia 基础导航实现:从页面切换到响应式交互全指南

在 Avalonia 开发中&#xff0c;导航功能是构建多页面应用的核心需求。Avalonia 无需依赖第三方库&#xff0c;仅通过内置控件与 MVVM 模式即可实现灵活的页面切换。本文将以 “基础导航” 为核心&#xff0c;从 ViewModel 与 View 设计、导航逻辑实现&#xff0c;到样式美化与…

UniApp 分包异步化配置及组件引用解决方案

具体参考微信小程序文档基础能力 / 分包加载 / 分包异步化 一、分包页面组件配置 在 UniApp 的pages.json中&#xff0c;为分包页面&#xff08;或主包如 tabbar 页面&#xff09;配置异步组件时&#xff0c;需同时设置usingComponents和componentPlaceholder&#xff1a; {&…

系统核心解析:深入操作系统内部机制——进程管理与控制指南(一)【进程/PCB】

♥♥♥~~~~~~欢迎光临知星小度博客空间~~~~~~♥♥♥ ♥♥♥零星地变得优秀~也能拼凑出星河~♥♥♥ ♥♥♥我们一起努力成为更好的自己~♥♥♥ ♥♥♥如果这一篇博客对你有帮助~别忘了点赞分享哦~♥♥♥ ♥♥♥如果有什么问题可以评论区留言或者私信我哦~♥♥♥ ✨✨✨✨✨✨个人…

微论-神经网络特征空间的动态聚集,对抗灾难性遗忘的新范式

这是一个非常有趣且富有想象力的理论构想。受陀螺仪启发&#xff0c;我将陀螺仪的“定轴性”与“进动性”原理引入神经网络的特征空间&#xff0c;探讨一种对抗灾难性遗忘的新范式。---### **基于陀螺仪原理的神经网络记忆巩固理论探讨**#### **引言&#xff1a;记忆的流失与稳…

鸿蒙审核问题——折叠屏展开态切换时,输入框内容丢失

文章目录背景解决历程1、无意中发现了眉目2、确定问题原因3、解决办法4、官方文档5、总结背景 奇葩的事情年年有啊&#xff0c;今年特别多。这不今天又遇到了一个奇葩的问题。鸿蒙NextAPP上架AppGallery市场&#xff0c;审核拒了&#xff0c;说是折叠屏手机展开态切换时&#…

前后端分离架构中,Node.js的底层实现原理与线程池饥饿问题解析

在VueJava/.NET的前后端分离架构中&#xff0c;Node.js的底层实现原理与线程池饥饿问题解析 一、架构概述&#xff1a;Node.js的定位与角色 在现代Web开发中&#xff0c;Vue.js作为前端框架与Java/.NET后端结合的架构非常流行。在这种架构中&#xff0c;Node.js通常扮演着两个关…

Django ModelForm:快速构建数据库表单

Django 中的 forms.ModelForm —— 它是 Django 表单系统和 ORM 的一个“桥梁”&#xff0c;能帮助你快速基于 数据库模型&#xff08;Model&#xff09; 自动生成表单&#xff0c;极大减少重复代码。1. 什么是 ModelForm 普通 Form (forms.Form)&#xff1a;完全手写字段&…

补 json的作用

&#xff1a;“我开车直接拧钥匙就能走&#xff0c;为什么还要看仪表盘和用中控台&#xff1f;”直接点击“运行”&#xff0c;就像是汽车的自动驾驶模式。它能帮你开起来&#xff0c;但你不知道它走的是哪条路&#xff0c;油门踩多深。使用 launch.json 配置&#xff0c;就像是…

apache详细讲解(apache介绍+apache配置实验+apache实现https网站)

1.apache HTTP server介绍httpd项目地址:https://httpd.apache.org/ 在Apache2中有三种工作模式&#xff0c;使用者可以根据不同的业务场景来进行选择(1)prefork模式prefork模式是一种老而稳的模式:一个主进程管理者多个子进程&#xff0c;每个子进程单独处理用户请求&#xf…

jajajajajajajava

线程1 线程概念进程:进程指正在内存中运行的程序。进程具有一定的独立性。线程:线程是进程中的一个执行单元。负责当前进程中程序的执行。一个进程中至少有一个线程。如果一个进程中有多个线程&#xff0c;称之为多线程程序。java中的线程采用的是抢占式调度&#xff0c;如果线…

虚拟机CentOS里JDK的安装与环境配置

---本文以JDK17为例---步骤 1&#xff1a;进入/tmp临时目录# 进入临时目录 cd /tmp步骤 2&#xff1a;下载 Java 17 安装包wget https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.9%2B9/OpenJDK17U-jdk_x64_linux_hotspot_17.0.9_9.tar.gz步骤 3&am…

mybatis-plus多租户兼容多字段租户标识

默认租户插件处理器的缺陷 在springboot工程中引入mybatis-plus的租户插件TenantLineInnerInterceptor&#xff0c;能简化我们的数据隔离操作&#xff0c;例如各类含租户用户登录权限的rest接口中&#xff0c;不需要再根据登录用户-set租户条件-触发查询&#xff0c;租户插件能…

HBase高级特性(布隆过滤器和协处理器)、列族设计、rowkey设计以及热点问题处理

在阐述HBase高级特性和热点问题处理前&#xff0c;首先回顾一下HBase的特点&#xff1a;分布式、列存储、支持实时读写、存储的数据类型都是字节数组byte[]&#xff0c;主要用来处理结构化和半结构化数据&#xff0c;底层数据存储基于hdfs。 同时&#xff0c;HBase和传统数据库…

redis sentinel 与 clauster 的区别

Redis Sentinel(哨兵)和Redis Cluster(集群)是Redis提供的两种不同的高可用和扩展性解决方案,它们的设计目标和适用场景有显著区别: 1. 核心功能与目标 Redis Sentinel 主要解决主从架构的高可用问题,实现自动故障转移 监控主从节点状态,当主节点故障时自动将从节点提…

MySQL数据库中快速导入大数据sql

1.PwerShell命令页面导入全表数据库 -P3310 指定数据库端口号Get-Content "本地sql文件目录" | .\mysql -u root -p -P 33102.PwerShell命令页面导入单表到数据库 -P3310 指定数据库端口号Get-Content "本地sql文件目录" | .\mysql -u root -p -P 3310 数…

消息类型proto的编写和生成

消息类型proto的编写和生成 代码如下&#xff1a; syntax"proto3"; package xypmq;enum ExchangeType {UNKNOWNTYPE0;DIRECT1;FANOUT2;TOPIC3; };enum DeliveryMode {UNKNOWNMODE0;UNDURABLE1;DURABLE2; };message BasicProperties {string id1;DeliveryMode deliver…