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
英文地址,請注明出處:http://en.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…