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

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

目录
相关文章
|
8月前
|
存储 安全 Java
探索 Java 静态变量(static)的奥秘
本文深入探讨了Java中的静态变量(`static`),从初印象、使用场景、访问方式、初始化、线程安全、优缺点到最佳实践,全面解析其特性和应用场景。静态变量属于类而非实例,适用于共享数据、定义全局常量和工具类中的变量。它在类加载时初始化,生命周期贯穿整个程序运行。然而,多线程环境下需注意线程安全问题,可通过`synchronized`或原子类解决。优点包括共享数据方便和提高性能,但也存在线程安全和代码耦合度增高的缺点。最佳实践建议谨慎使用、保证线程安全、遵循命名规范并封装访问。掌握静态变量的正确用法,能让你的代码更加高效简洁。
545 11
|
存储 Java
|
开发工具 git
完美解决 fatal: unable to access ‘https://github.com/.../.git‘: Could not resolve host: github.com
完美解决 fatal: unable to access ‘https://github.com/.../.git‘: Could not resolve host: github.com
34940 1
|
Java 索引 容器
【JavaSE专栏28】数组下标能越界?越界了如何处理?
【JavaSE专栏28】数组下标能越界?越界了如何处理?
652 0
|
图形学 C++
Qt实现Qchart的打印和打印预览的几种方法
Qt实现Qchart的打印和打印预览的几种方法
Python正整数分解质因数
Python正整数分解质因数
|
编解码 API Android开发
ffmpeg之硬解码
安卓使用ffmpeg实现硬解码
923 0
|
Linux Shell 开发工具
linux下安装和卸载自己想要版本的git版本
linux下安装和卸载自己想要版本的git版本
764 0
|
Web App开发 Java 应用服务中间件
Spring Boot快速开发利器:Spring Boot CLI
Spring Boot CLI(Command Line Interface)是一个命令行工具,您可以用它来快速构建Spring原型应用。通过Spring Boot CLI,我们可以通过编写Groovy脚本来快速的构建出Spring Boot应用,并通过命令行的方式将其运行起来。
4381 0
|
分布式计算 大数据 MaxCompute
阿里云大数据利器之-使用flume+sql实现流计算做实时展现业务(归档Maxcompute)
实时业务处理的需求越来越多,也有各种处理方案,比如storm,spark等都可以。那以数据流的方向可以总结成数据源-数据搜集-缓存队列-实时处理计算-数据展现。本文就用阿里云产品简单实现了一个实时处理的方案。
5275 0