C程序设计语言第二版习题4-1

简介: 编写一个函数strrindex(s, t),用于返回字符串t在s中最右出现的位置,如果 s中不 包含t,那么返回-1。

问题描述

编写一个函数strrindex(s, t),用于返回字符串t在s中最右出现的位置,如果 s中不 包含t,那么返回-1。

问题分解

  • 主函数main
  • 工具函数 get_line(s, max), 注意不能按照书上的getline,因为getline 已经在头文件stdio.h定义了
  • 核心函数 strrindex(source, searchfor)。这道题是根据书中strindex例子进行变化,我们先来看看strindex的程序实现:
int strindex(char s[], char t[])
{
        int i, j, k;
        for(i = 0; s[i] != '\0'; i++){
                for(j = i, k = 0; t[k] != '\0' && s[j] == t[k]; j++, k++)
                        ;
​
                if(k > 0 && t[k] == '\0'){
                    return i;
                }
        }
        return -1;
}

分析strindex可以发现,这个函数是只要在source中发现searchfor字符串,就返回当前的i,即返回所查找字符串的第一次出现的位置。我们现在要寻找的是最后一次出现的位置,因此我们对strindex进行修改,取消第9行的return,取而代之使用一个变量pos来承接每次出现searchfor的位置,因此pos会及时更新,直到source遍历结束。

代码实现

#include<stdio.h>
​
#define MAXLINE 100
​
int get_line(char s[], int max);
int strrindex(char source[], char searchfor[]);
char pattern[] = "ould";
​
int main()
{
        char line[MAXLINE];
        int found = 0, pos;
​
        while(get_line(line, MAXLINE) > 0){
                if((pos = strrindex(line, pattern)) >= 0){
                        printf("The position is :%d \n", pos);
                        found++;
                }
​
        }
        return found;
}
​
int get_line(char s[], int max)
{
        int i = 0;
        char c;
​
        while(--max > 0 && (c = getchar()) != '\0' && c != '\n'){
                s[i++] = c;
        }
        if(c == '\n'){
                s[i++] = c;
        }
        s[i] = '\0';
        return i;
}
​
int strrindex(char s[], char t[])
{
        int i, j, k, pos = -1;
        for(i = 0; s[i] != '\0'; i++){
                for(j = i, k = 0; t[k] != '\0' && s[j] == t[k]; j++, k++)
                        ;
​
                if(k > 0 && t[k] == '\0'){
                    pos = i;
                }
        }
        return pos;
}

编译运行

image

运行结果可看出,达到了预期的。

目录
相关文章
|
9月前
|
存储 安全 数据可视化
档案宝自动化档案管理,从采集、整理到归档、利用,一步到位
当档案管理成为“效率瓶颈”,我们需要怎样的解决方案? 在数字化转型浪潮下,档案管理早已不再是简单的“文件存放”——企业需要快速调取合同凭证应对审计,教育机构则要长期保存学生成长记录……档案既是历史凭证,也是决策依据,更是核心资产。
|
Ubuntu Linux 开发者
国产 Linux 发行版再添新成员,CutefishOS 系统简单体验
当然,系统生态构建过程并不简单,不过为了帮助国产操作系统优化生态圈,部分企业也开始用国产操作系统替代 Windows,我们相信肯定会有越来越多的精品软件登录 Linux 平台。
1000 0
|
机器学习/深度学习 传感器 搜索推荐
《洞察因果本质:解锁智能体大模型精准预测的底层逻辑》
因果表征学习作为新兴领域,致力于挖掘数据背后的因果结构,突破传统基于相关性的表征学习局限,为智能体大模型提供更精准的预测能力。通过揭示数据生成机制、打破相关性局限和整合多源信息,它在工业故障预测、农业产量优化、电商推荐等领域展现巨大潜力。尽管面临数据挖掘与框架融合等挑战,但其未来前景广阔,有望推动医疗、金融、智慧城市等多领域实现更深层次的理解与决策优化。
453 11
|
消息中间件 Cloud Native Linux
6754支队伍,13个开源社区,邀请你一起参与“用通义灵码,人人都是开源贡献者”赛事
2024天池云原生编程挑战赛-赛道3『用通义灵码,人人都是开源贡献者』正火热进行。通过通义灵码快速掌握开源项目,每个赛道5000元大奖及精美礼品等你来拿。
435 0
|
弹性计算 负载均衡 数据库
阿里云轻量应用服务器优惠价格表
阿里云轻量应用服务器2核4G4M带宽60GB高效云盘优惠价196元一年,2核2G3M带宽配置一年优惠价99元,阿里云百科分享阿里云轻量应用服务器2核4G详细配置、优惠价格、购买条件及性能评测:
390 0
阿里云轻量应用服务器优惠价格表
|
算法
C程序设计语言第二版习题2-9
在求反码时,表达式 x &= (x - 1) 用于把x最右边的值为1的位删除掉。请解释一下这样做的道理。用这一方法重写bitcount函数 ,使之执行得更快一点
1020 0
|
弹性计算
ECS使用报告
学生体验ECS服务器报告
|
机器学习/深度学习 算法 JavaScript
C程序设计语言第二版习题3-6
修改itoa函数,使得该函数可以接收三个参数。其中,第三个参数为最小字段宽度。为了保证转换后所得的结果至少具有第三个参数指定的最小宽度,在必要时应在所得结果的左边填充一定的空格。
1027 0
|
机器学习/深度学习 算法 JavaScript
C程序设计语言第二版习题3-5
编写函数itob(n, s, b) ,用于把整数n转换成以b为基数的字符串并存到字符串s中。例如, itob(n, s, 16) 表示将n转换成16进制数,并存入s中。
1206 0
|
机器学习/深度学习 JavaScript
C程序设计语言第二版习题3-4
在数的反码表示中,上述的 itoa 函数不能处理最大的负数,即 n 等于-2^(字长-1) 的情况。请解释其原因。修改该函数,使它在任何机器上运行时都能打印出正确的值。
892 0

热门文章

最新文章