问题描述
编写一个函数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;
}
编译运行
运行结果可看出,达到了预期的。