K&R原著 查找包含指定字符串的行

本文介绍了一个使用C语言实现的字符串搜索程序,通过自定义的getline和strindex函数,程序能够从标准输入读取多行文本,并查找特定模式的出现位置。文章详细解释了函数的工作原理,并提供了两种不同的strindex函数实现,一种用于查找首次出现的位置,另一种用于查找最后一次出现的位置。
#include<stdio.h>
#define MAXLINE 1000//最大行长度
//函数声明
int getline(char s[], int lim);
int strindex(char s[], char t[]);

char pattern[] = "could";//待寻找的字符串
int main()
{
	char line[MAXLINE];
	int found = 0;
	while (getline(line, MAXLINE) > 0)
		if (strindex(line, pattern) >= 0) {
			printf("%s", line);
			found++;
		}
	return (found);//返回匹配数目
}
//保存字符串行到数组s中,返回该行长度i;主调函数中,当行长度大于0则执行循环
int getline(char s[], int lim)//对应实参char line[MAXLINE],MAXLINE
{
	int c, i;
	i = 0;
	while (--lim > 0 && (c = getchar()) != EOF && c != '\n')
		s[i++] = c;//先赋值后自增,区别于s[++i]
	if (c == '\n')
		s[i++] = c;
	s[i] = '\0';//空字符,标志字符串的结束
	return (i);//返回该行的长度
}
//比较待查找字符串t[k]与输入字符串,返回t在s中的位置,若未查找到则返回-1;
主调函数若查找到则打印输出,反之不打印
int strindex(char s[], char t[])//对应实参line,pattern
{
	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函数不难发现,该函数只要找到带寻找字符串t在字符串s中第一次出现的位置(从左向右遍历,最左边的位置)就结束循环;对strindex稍作修改,使该函数在找到字符串t之后不结束,而是继续向右匹配,知道结束。这样这个函数则实现了返回t在s中最后一次出现的位置。
代码如下:

int strindex(char s[], char t[])//对应实参line,pattern
{
	int i, j, k, pos;
	pos = -1;//pos记录待查字符串t出现的次数,若未查找到t,则返回初值-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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值