题目:
本题要求实现一个函数,对给定的一个字符串和两个字符,打印出给定字符串中从与第一个字符匹配的位置开始到与第二个字符匹配的位置之间的所有字符。
函数接口定义:
char *match( char *s, char ch1, char ch2 );
函数match应打印s中从ch1到ch2之间的所有字符,并且返回ch1的地址。
例子
1. 输入样例1:(都找到了)
program
r g
输出样例
rog
rogram
2. 输入样例 (没找到ch1)
program
z o
输出样例
(空行)
(空行)
3. 输入样例 (ch1找到ch2没找到)
program
g z
输出样例3:
gram
gram
#include <stdio.h>
#define MAXS 10
char *match( char *s, char ch1, char ch2 );
int main()
{
char str[MAXS], ch_start, ch_end, *p;
scanf("%s\n", str);
scanf("%c %c", &ch_start, &ch_end);
p = match(str, ch_start, ch_end);
printf("%s\n", p);
return 0;
}
//答案如下:
//法一
#include<string.h>
char *match( char *s, char ch1, char ch2 ){
int i, f1, f2;
f1 = f2 = -1; //设为负数是因为数组下标为非负
for(i = 0; s[i]; i++){
if(s[i] == ch1 && f1 < 0) //如果f1为负说明还未找到
f1 = i; //若找到就把第一次出现的下标赋给f1
if(s[i] == ch2 && f2 < 0) //同上
f2 = i;
if(f1 >= 0 && f2 >= 0) //若都找到了则跳出循环
break;
}
if(f1 >= 0 && f2 >= 0){ //若都找到了
for(i = f1; i <= f2; i++)
printf("%c%s", s[i], i < f2 ? "" : "\n");
return s + f1;
}
else if(f2 < 0){ //若f1找到f2没找到则直接从f1处开始输出到字符串尾
printf("%s\n", s + f1);
return s + f1;
}
else{ //都没找到
printf("\n"); //输出空行
return s + strlen(s); //返回\0的地址
}
}
//法二
#include<string.h>
char* match(char* s, char ch1, char ch2) {
int i, f1, f2;
char temp[15];
int len = strlen(s);
f1 = f2 = len; // 开始时假设ch1和ch2的位置在末尾,同样是方便返回值
for (i = 0; s[i]; i++) {
if (f1 == len && s[i] == ch1)
f1 = i;
if (f2 == len && s[i] == ch2)
f2 = i;
if (f1 < len && f2 < len)
break;
}
if (f1 < len && f2 < len) {
strncpy(temp, s + f1, f2 - f1 + 1); // 将ch1到ch2之间的字符串拷贝并输出
printf("%s\n", temp);
}
else
printf("%s\n", s + f1); // 其他情况都是直接从ch1到末尾
return s + f1;
}