算法竞赛--字符串处理(一)

1.字符串去特定字符

输入字符串s和字符c,要求去掉s中所有的c字符,并输出结果。

输入信息:

测试数据有多组,每组输入字符串s和字符c。

输出信息:

对于每组输入,输出去除c字符后的结果。

样例输入:

1
2
goaod
a

样例输出:

1
good

注意:

(1)测试数据为多组

(2)gets()会吸收换行,用getchar()吸收掉printf()的换行.

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<stdio.h>
#include <string.h>
char a[105],b[105];
int main()
{
char c;
while(gets(a) )
{
scanf("%c",&c);
int len=strlen(a),count=0;
for(int i=0;i<len;i++)
{
if(a[i]!=c)
b[count++]=a[i];
}
b[count]='\0';
printf("%s\n",b);
getchar();
}
return 0;
}

2.单词替换

输入一个字符串,以回车结束(字符串长度<=100)。该字符串由若干个单词组成,单词之间用一个空格隔开,所有单词区分大小写。现需要将其中的某个单词替换成另一个单词,并输出替换之后的字符串。

输入信息:

多组数据。每组数据输入包括3行,
第1行是包含多个单词的字符串 s,
第2行是待替换的单词a,(长度<=100)
第3行是a将被替换的单词b。(长度<=100)
s, a, b 最前面和最后面都没有空格。

输出信息:

每个测试数据输出只有 1 行,
将s中所有单词a替换成b之后的字符串。

样例输入:

1
2
3
I love Tian Qin
I
You

样例输出:

1
You love Tian Qin

注意:1.多组输入输出,包含空格.

2注意单词的长度,报RE的错误.

注意:3.执行一次,注意清空数组,AC%50。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
#include <string.h>
int main()
{
char a[105],b[105],c[105];
while(gets(a) && gets(b) && gets(c))//分别输入字符串,和两个单词.
{
char ans[105][105]={{}};
int len=strlen(a),r=0,h=0;
for(int i=0;i<len;i++)//逐个读取每个单词,并存储
{
if(a[i]!=' ')
ans[r][h++]=a[i];
else
{
ans[r][h]='\0';
r++;
h=0;
}
}
for(int i=0;i<=r;i++)
{
if(strcmp(ans[i],b)==0)//如果两个单词能够匹配,进行替换输出
printf("%s",c);
else
printf("%s",ans[i]);
if(i!=r)
printf(" ");
else
printf("\n");
}
}
return 0;
}

3.编排字符串

请输入字符串,最多输入4 个字符串,要求后输入的字符串排在前面,例如

输入:EricZ

输出:1=EricZ

输入:David

输出:1=David 2=EricZ

输入:Peter

输出:1=Peter 2=David 3=EricZ

输入:Alan

输出:1=Alan 2=Peter 3=David 4=EricZ

输入:Jane

输出:1=Jane 2=Alan 3=Peter 4=David

输入信息:

第一行为字符串个数m,接下来m行每行一个字符床,m不超过100,每个字符床长度不超过20。

输出信息:

输出m行,每行按照样例格式输出,注意用一个空格隔开。

样例输入:

1
2
3
4
5
6
5
EricZ
David
Peter
Alan
Jane

样例输出:

1
2
3
4
5
1=EricZ
1=David 2=EricZ
1=Peter 2=David 3=EricZ
1=Alan 2=Peter 3=David 4=EricZ
1=Jane 2=Alan 3=Peter 4=David

注意:

(1)注意存储类似堆栈,先输入的后输出

(2)注意最多只能输出四个,并且输出后四个.

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
int main()
{
char ans[105][25];
int m;
scanf("%d",&m);
for(int i=0;i<m;i++)
{
scanf("%s",ans[i]); //读入一个单词,并且存储在数组中。
for(int j=0;j<=i&&j<=3;j++)//最多进行四次循环输出四个数.
{
printf("%d=%s",j+1,ans[i-j]);
if(i!=j) //如果不是输入最后一个单词,则输出空格
printf(" ");
}
printf("\n"); //输出换行
}
return 0;
}

4.字符串的查找删除

给定一个短字符串(不含空格),再给定若干字符串,在这些字符串中删除所含有的短字符串。

输入信息:

输入只有1组数据。
输入一个短字符串(不含空格),再输入若干字符串直到文件结束为止。

输出信息:

删除输入的短字符串(不区分大小写)并去掉空格,输出。

样例输入:

1
2
3
4
5
6
7
in
#include
int main()
{

printf(" Hi ");
}

样例输出:

1
2
3
4
5
6
#clude
tma()
{

prtf("Hi");
}

注意:

(1)测试数据为多组

(2)gets()会吸收换行,用getchar()吸收掉scanf()的换行。

(3)将字符串中的In、IN、iN、in删除。

(4)将字符串空间开辟的大一点,RE%50。

(5)注意空格不输出。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include<stdio.h>
#include <string.h>
char a[1005],b[1005];
int main()
{
scanf("%s",a);
getchar(); //吸收scanf()的换行
int lenA=strlen(a);
for(int i=0;i<lenA;i++)//将所有大写字母转换为小写
if(a[i]>='A'&&a[i]<='Z')
a[i]=a[i]+32;
while(gets(b))
{
int lenB=strlen(b),i=0,j;
while(i<lenB) //从下标0开始循环,直至最后
{
for(j=i;j<i+lenA;j++) //从i开始在lenA的空间内进行匹配,匹配不成功,则跳出循环
if(b[j]!=a[j-i]&&b[j]+32!=a[j-i])
break;
if(j>=i+lenA) //如果匹配成功,i从i+lenA开始
i=i+lenA;
else
{
if(b[i]!=' ')//否则并且不为空格的话,进行输出该字符,i++
printf("%c",b[i]);
i++;
}
}
printf("\n");
}
return 0;
}
小礼物走一个哟
0%