练习一 零起点学算法68——删除字符
Description
从键盘输入任意一个字符串和一个字符,要求从该字符串中删除所有该字符。
Input
输入有多组测试数据。
每组两行,第一行是字符串(字符串至少还有一个字符,不多于100个),第二行是一个字符
Output
每组输出一行,删除了所有应删除字符后的字符串
Sample Input
ABCDE
E
ASD Dfg fhd
D
Sample Output
ABCD
AS fg fhd
测试代码一:
#include<stdio.h>
#include<string.h>
/*
Description
从键盘输入任意一个字符串和一个字符,要求从该字符串中删除所有该字符。
Input
输入有多组测试数据。
每组两行,第一行是字符串(字符串至少还有一个字符,不多于100个),第二行是一个字符
Output
每组输出一行,删除了所有应删除字符后的字符串
*/
int fun_cut(char *ptoc, char a,int cnt); //删除字符串中指定字符并返还头指针
int main()
{
char str[100];
char a;
while (gets(str) && gets(&a) != NULL)
{
char *ptoc = str;
int i;
int cnt = strlen(str);
cnt = fun_cut(ptoc, a, cnt);
for (i = 0; i < cnt; i++)
printf("%c", *(ptoc + i));
printf("\n");
}
return 0;
}
int fun_cut(char *ptoc, char a,int cnt) //删除字符串中指定字符并返还头指针
{
int i,j;
for (i = 0; i < cnt; i++)
{
for(;*(ptoc+i)==a;)
{
if (i == cnt - 1)
{
cnt--;
break;
}
else for (j = i; j + 1 < cnt; j++) *(ptoc + j) = *(ptoc + j + 1);
cnt--;
}
}
return cnt;
}
运行结果:
测试结果:wrong!!!
!?完全不知道错在哪里
测试代码二:
#include<stdio.h>
#include<string.h>
/*
Description
从键盘输入任意一个字符串和一个字符,要求从该字符串中删除所有该字符。
Input
输入有多组测试数据。
每组两行,第一行是字符串(字符串至少还有一个字符,不多于100个),第二行是一个字符
Output
每组输出一行,删除了所有应删除字符后的字符串
*/
void fun_cut(char *ptos, char ch); //删除字符串中指定字符并返还头指针
int main()
{
char str[100] = { 0 ,},ch,b;
while (gets(str) != NULL)
{
ch = getchar();
b=getchar(); //过滤掉输入的换行符
fun_cut(str, ch);
puts(str);
}
return 0;
}
void fun_cut(char *ptos, char ch) //删除字符串中指定字符并返还头指针
{
char *_ptos_1 = ptos;
for (; *ptos != 0; ptos++)
if (*ptos != ch) *_ptos_1++ = *ptos;
*_ptos_1 = 0;
}
运行结果: 通过
小结:测试代码一程序编写没有到位,while (gets(str) && gets(&a) != NULL)语句没有实现获得str与a的目的,第一应该使用a=getchar()来获取a;第二,编写时没有考虑到换行符的影响,应当用一个变量b,来b=getchar()过滤掉换行符,于是精简程序得到如下代码
但是如图调试窗口所示,我需要的字符ch为\n换行符,b反而为我输入的空格字符,猜想到当使用getchar时它是从右开始录入字符的,当右数第一个字符被赋予给第一个getchar后,第二个getchar将右数第二个字符赋予下一个变量(换行符也算),于是将用于过滤换行符的语句放到靠后位置
练习二: 零起点学算法69——查找最大元素
Description
对于输入的每个字符串,查找其中的最大字母,在该字母后面插入字符串“(max)”。
Input
输入数据包括多个测试实例,每个实例由一行长度不超过100的字符串组成,字符串仅由大小写字母构成。
Output
对于每个测试实例输出一行字符串,输出的结果是插入字符串“(max)”后的结果,如果存在多个最大的字母,就在每一个最大字母后面都插入”(max)”。
Sample Input
abcdefgfedcba
xxxxx
Sample Output
abcdefg(max)fedcba
x(max)x(max)x(max)x(max)x(max)
测试代码一:
#include<stdio.h>
#include<string.h>
/*
Description
对于输入的每个字符串,查找其中的最大字母,在该字母后面插入字符串“(max)”。
Input
输入数据包括多个测试实例,每个实例由一行长度不超过100的字符串组成,字符串仅由大小写字母构成。
Output
对于每个测试实例输出一行字符串,输出的结果是插入字符串“(max)”后的结果
如果存在多个最大的字母,就在每一个最大字母后面都插入"(max)"。
*/
#define Pm printf("(max)")
void fun_findmax(char *ptos);
int main()
{
char str[100];
while (gets(str) != NULL)
{
char *ptos = str;
fun_findmax(ptos);
}
return 0;
}
void fun_findmax(char *ptos)
{
int i;
int cnt = strlen(ptos);
int max = (int)*ptos;
for (i = 1; i < cnt; i++)
max = max > *(ptos + i) ? max : *(ptos + i);
for (i = 0; i < cnt; i++)
{
if((int)*(ptos + i)==max)
{
printf("%c", *(ptos + i));
Pm;
}
else printf("%c", *(ptos + i));
}
printf("\n");
}
运行结果:
测试结果:Aceepted!!