1.L2-2H【使用指针】 指定位置输出字符串
本题要求实现一个函数,对给定的一个字符串和两个字符,打印出给定字符串中从与第一个字符匹配的位置开始到与第二个字符匹配的位置之间的所有字符。
函数接口定义:
char *match( char *s, char ch1, char ch2 );
函数match
应打印s
中从ch1
到ch2
之间的所有字符,并且返回ch1
的地址。
裁判测试程序样例:
#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;
}
/* 你的代码将被嵌在这里 */
输入样例1:
program
r g
输出样例1:
rog
rogram
输入样例2:
program
z o
输出样例2:
(空行)
(空行)
输入样例3:
program
g z
输出样例3:
gram
gram
代码如下:
char *match( char *s, char ch1, char ch2 )
{
int i;
int flag = 0;
char *p = "", *point = s;
for (i = 0; *(s + i) != '\0'; i++) {
if (*(s + i) == ch1 && flag == 0) {
p = point;
flag = 1;
}
if (flag == 1) {
printf("%c", *(s+i));
if (*(s + i) == ch2) {
flag = 0;
break;
}
}
point++;
}
printf("\n");
return p;
}
2.L2-3H【使用指针】 查找子串
本题要求实现一个字符串查找的简单函数。
函数接口定义:
void zip( char *p );
函数search
在字符串s
中查找子串t
,返回子串t在s
中的首地址。若未找到,则返回NULL。
裁判测试程序样例:
#include <stdio.h>
#define MAXS 30
char *search(char *s, char *t);
void ReadString( char s[] ); /* 裁判提供,细节不表 */
int main()
{
char s[MAXS], t[MAXS], *pos;
ReadString(s);
ReadString(t);
pos = search(s, t);
if ( pos != NULL )
printf("%d\n", pos - s);
else
printf("-1\n");
return 0;
}
/* 你的代码将被嵌在这里 */
输入样例1:
The C Programming Language
ram
输出样例1:
10
输入样例2:
The C Programming Language
bored
输出样例2:
-1
代码如下:
char *search( char *s, char *t )
{
int flag = 0;
int i, j, first;
int len = 0;
for (i = 0; *(t + i) != '\0'; i++) {
len++;
}
for (i = 0; *(s + i) != '\0'; i++) {
if (*(s + i) == *t) {
first = i;
for (j = 0; j < len; j++, i++) {
if (*(s + i) != *(t + j))
break;
}
if (len == j) return first + s;
}
}
return NULL;
}
3.L1-1H【例8-8】 字符串压缩
本题要求实现一个字符串压缩的简单函数。压缩规则是:如果某个字符x
连续出现n
(n>1)次,则将这n
个字符x
替换为nx
的形式;否则保持不变。
函数接口定义:
void zip( char *p );
函数zip
对p
指向的字符串进行压缩操作。
裁判测试程序样例:
#include <stdio.h>
#define MAXS 20
void zip( char *p );
void ReadString( char *s ); /* 由裁判实现,略去不表 */
int main()
{
char s[MAXS];
ReadString(s);
zip(s);
printf("%s\n", s);
return 0;
}
/* 请在这里填写答案 */
输入样例:
Mississippi
输出样例:
Mi2si2si2pi
代码如下:
void zip( char *p )
{
int n;
int i;
char *a=p;
while(*p) {
n=1;
while (*p==*(p+1)) {
n++;
p++;
}
if (n>10) {
*a++=n/10+'0';
*a++=n%10+'0';
} else if (n>1) {
*a++=n+'0';
}
*a++=*p;
p++;
}
*a++='\0';
}