算法笔记习题3.6

  • 问题 A: 字符串连接

 

题目描述

不借用任何字符串库函数实现无冗余地接受两个字符串,然后把它们无冗余的连接起来。

输入

每一行包括两个字符串,长度不超过100。

输出

可能有多组测试数据,对于每组数据,
不借用任何字符串库函数实现无冗余地接受两个字符串,然后把它们无冗余的连接起来。
输出连接后的字符串。

样例输入

abc def

样例输出

abcdef

 

#include <stdio.h>
//#include <string.h>

int main ()
{
	char str1[101],str2[101],str[202];
	//memset(str,0,sizeof(str));
	int len1,len2,count;
	while(scanf("%s%s",str1,str2) != EOF)
	{
		len1=len2=0;
		for(int i=0;1;i++)//计算len1 
		{
			if(str1[i] != '\0')
			{
				len1++;
			}
			else break;
		}
		for(int i=0;1;i++)//计算len2 
		{
			if(str2[i] != '\0')
			{
				len2++;
			}
			else break;
		}
		count=0;
		for(int i=0;i<len1+len2;i++)
		{
			if(i<len1)
			{
				str[i]=str1[i];
			}
			else (str[i]=str2[count++]);
		} 
		for(int i=0;i<len1+len2;i++)
		{
			printf("%c",str[i]);
		}
		printf("\n");
		//printf("%d",strlen(str));
	}
	return 0;
}

 

  • 问题 B: 首字母大写

 

题目描述

对一个字符串中的所有单词,如果单词的首字母不是大写字母,则把单词的首字母变成大写字母。
在字符串中,单词之间通过空白符分隔,空白符包括:空格(' ')、制表符('\t')、回车符('\r')、换行符('\n')。

输入

输入一行:待处理的字符串(长度小于100)。

输出

可能有多组测试数据,对于每组数据,
输出一行:转换后的字符串。

样例输入

if so, you already have a google account. you can sign in on the right.

样例输出

If So, You Already Have A Google Account. You Can Sign In On The Right.

 

#include <stdio.h>
#include <string.h>
//特别注意输入str中可能有换行符,输出中也是。
//puts,gets函数以换行符结束,导致后面的字符不能输入或输出 
int main()
{
	char str[101];
	//memset(str,' ',sizeof(str));
	while(gets(str) != NULL)
	{
		if(str[0]>='a'&&str[0]<='z') 
		{
			str[0]=str[0]-32;
		}
		for(int i=1;i<strlen(str);i++)
		{	
			if(str[i]=='\n'||str[i]=='\t'||str[i]=='\r'||str[i]==' ')
			{
				if(str[i+1]>='a'&&str[i+1]<='z')
				{
					str[i+1]=str[i+1]-32;
				}
			}
		}
		puts(str);
	}
	return 0;
} 

 

 

  • 问题 C: 字符串的查找删除

 

题目描述

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

输入

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

输出

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

样例输入

in
#include 
int main()
{

printf(" Hi ");
}

样例输出

#clude
tma()
{

prtf("Hi");
}

提示

 

注:将字符串中的In、IN、iN、in删除。

 

#include <stdio.h>
#include <string.h>
//算法思想是将短字符串str0变成小写,将长字符串str1复制给另一个
//长字符串str2,然后也str1变成小写,再将str1和str0逐字符比较
//出现跟str0相同的字符段就跳过,不相同的字符段且不为空格
//的字符即用str2输出 
char str0[1000],str1[1001][1001],str2[1001][1001];
int main()
{
	int count0,count1=0,count2,j,k;
	gets(str0);
	while(gets(str1[count1]) != NULL)
	{
		count1 ++;
	}
	count0=strlen(str0);
	//将短字符串全部变为小写字母 
	for(int i=0;i<count0;i++) 
	{
		if(str0[i]>='A' && str0[i]<='Z')
		{
			str0[i]=str0[i]+32;
		}
	}
	for(int i=0;i<count1;i++)
	{
		for( j=0;j<strlen(str1[i]);j++)
		{
			//将str1的所有字符复制到str2 
			str2[i][j]=str1[i][j];
			//把str1的所有大写字符改成小写 
			if(str1[i][j]>='A'&&str1[i][j]<='Z')
			{
				str1[i][j]=str1[i][j]+32;
			} 
		}
		j=0,k=0;
		//一行一行读取str1然后跟str0逐个字符进行比较 
		for(;j<strlen(str1[i]);)
		{
			if(str1[i][j+k] == str0[k])
			{
				k ++;
				if(k==strlen(str0))
				{
					j=j+k;
					k=0;
				}
			}
			else 
			{
				if(str2[i][j] != ' ')
				{
					printf("%c",str2[i][j]);
				}
				j ++;
				k=0;	
			} 
		} 
		printf("\n");
	} 
	return 0;
}

 

 

  • 问题 D: 单词替换

 

题目描述

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

输入

多组数据。每组数据输入包括3行,

第1行是包含多个单词的字符串 s,

第2行是待替换的单词a,(长度<=100)

第3行是a将被替换的单词b。(长度<=100)

s, a, b 最前面和最后面都没有空格。

输出

每个测试数据输出只有 1 行,

将s中所有单词a替换成b之后的字符串。

样例输入

I love Tian Qin
I
You

样例输出

You love Tian Qin

 

#include <stdio.h>
#include <string.h>
//算法思想为因题目是以单词进行替换,所以想到用strcmp函数
//进行比较然后进行替换输出或者输出原来的字符串
//之后注意好换行与空格的输出就行 
int main()
{
	char str0[201],str1[101],str2[101],str3[101];
	int len0,count;
	while(gets(str0) !=NULL)
	{
		count=0;
		gets(str1);
		gets(str2);
		len0=strlen(str0);
		memset(str3,0,sizeof(str3));
		//注意是i<=len0而不是i<len0,因为要读入字符串之后的\0 
		for(int i=0;i<=len0;i++)
		{
			if(str0[i] != ' ' && str0[i] != '\0')
			{
				str3[count++]=str0[i];
			}
			else
			{
				if(strcmp(str1,str3) == 0)
				{
					printf("%s",str2);
				}
				else printf("%s",str3);
				//如果不是最后一个单词就输出空格 
				if(str0[i] != '\0') printf(" ");
				memset(str3,0,sizeof(str3));
				count=0;
			}
		}
		printf("\n");
	}
	return 0;
}

 

 

  • 问题 E: 字符串去特定字符

 

题目描述

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

输入

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

输出

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

样例输入

goaod
a

样例输出

good

 

 

#include <stdio.h>
#include <string.h>
char str[100001];
int main()
{
	char a,b;
	int len;
	while(gets(str) != NULL)
	{
		fflush(stdin);
		scanf("%c",&a);
		getchar();//不知道为嘛似乎用fflush<stdin>清不掉scanf后的换行符 
		len=strlen(str);
		for(int i=0;i<len;i++)
		{
			if(str[i] != a)
			{
				printf("%c",str[i]);
			}
		}
		printf("\n");
	}
	return 0;
}

 

 

  • 问题 F: 数组逆置

 

题目描述

输入一个字符串,长度小于等于200,然后将数组逆置输出。

输入

测试数据有多组,每组输入一个字符串。

输出

对于每组输入,请输出逆置后的结果。

样例输入

tianqin

样例输出

niqnait

提示

 

注意输入的字符串可能会有空格。

 

 

#include <stdio.h>
#include <string.h>
int main()
{
	char str[201];
	int len;
	while(gets(str) != NULL)
	{
		len=strlen(str);
		for(int i=len-1;i>=0;i--)
		{
			printf("%c",str[i]);
		}
		printf("\n");
	}
	return 0;
} 

 

 

  • 问题 G: 比较字符串

 

题目描述

输入两个字符串,比较两字符串的长度大小关系。

输入

输入第一行表示测试用例的个数m,接下来m行每行两个字符串A和B,字符串长度不超过50。

输出

输出m行。若两字符串长度相等则输出A is equal long to B;若A比B长,则输出A is longer than B;否则输出A is shorter than B。

样例输入

2
abc xy
bbb ccc

样例输出

abc is longer than xy
bbb is equal long to ccc

 

 

#include <stdio.h>
#include <string.h>
int main()
{
	char str1[51],str2[51];
	int m,len1,len2;
	scanf("%d",&m);
	while(m--)
	{
		memset(str1,0,sizeof(str1));
		memset(str2,0,sizeof(str2));
		scanf("%s%s",str1,str2);
		len1=strlen(str1);
		len2=strlen(str2);
		//printf("%d %d\n",len1,len2);
		if(len1==len2)
		{
			printf("%s is equal long to %s\n",str1,str2);
		}
		else if(len1>len2)
		{
			printf("%s is longer than %s\n",str1,str2);
		}
		else if(len1<len2)
		{
			printf("%s is shorter than %s\n",str1,str2);
		}
	}
	return 0;
}

 

 

  • 问题 H: 编排字符串

 

题目描述

请输入字符串,最多输入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行,每行按照样例格式输出,注意用一个空格隔开。

样例输入

5
EricZ
David
Peter
Alan
Jane

样例输出

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

 

#include <stdio.h>
int main()
{
	char str[100][21];
	int m,i=0,flag=0,count;
	scanf("%d",&m);//样例数m 
	while(m--)
	{
		count=1;
		scanf("%s",str[i++]);
		flag++;//标记是否有四个以上的字符串 
		if(flag<=4)//4个以下字符串的处理方式 
		{
			for(int j=i-1;j>=0;j--)
			{
				printf("%d=%s",count,str[j]);
				count ++;
				if(j!=0) printf(" ");
			}
		}
		else if(flag>4)//4个以上字符串的处理方式
		{
			for(int j=i-1;j>=i-4;j--) 	
			{
					printf("%d=%s",count,str[j]);
					count ++;
					if(j!=i-4) printf(" ");	
			}
		}
		if(m!=0) printf("\n");
		count=1;
	}
	return 0;
}

 

 

  • 问题 I: 【字符串】回文串

 

题目描述

读入一串字符,判断是否是回文串。“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。

输入

一行字符串,长度不超过255。

输出

如果是回文串,输出“YES”,否则输出“NO”。

样例输入

12321

样例输出

YES

 

#include <stdio.h>
#include <string.h>
int main()
{
	char str[260],str1[260];
	int count,count1;
	memset(str,0,sizeof(str));
	memset(str1,0,sizeof(str1));
	while(scanf("%s",str) != EOF)
	{
		count=strlen(str);
		count1=0;
		for(int i=count-1;i>=0;i--)
		{
			str1[count1++]=str[i];
		}
		if(strcmp(str,str1)==0)
		{
			printf("YES\n");
		}
		else printf("NO\n"); 
	}
	return 0;
 } 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值