《算法笔记》3.6小节——入门模拟->字符串处理

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

  • 输入
每一行包括两个字符串,长度不超过100
  • 输出
可能有多组测试数据,对于每组数据,
不借用任何字符串库函数实现无冗余地接受两个字符串,然后把它们无冗余的连接起来。
输出连接后的字符串。
  • 样例输入
abc def
  • 样例输出
abcdef

因为scanf会自动补全字符最后的\0,所以可以用这个当作判断条件,另外记得要在str3最后加上\0,不然会输出烫烫烫烫

#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
//const int maxn =85;
//char a[maxn];
int main()
{
	char str1[110], str2[110], str3[220];
	int len3;
	int i;
	while (scanf("%s %s", str1, str2) != EOF)
	{
		len3 = 0;
		for (i = 0; str1[i] != '\0'; i++)
		{
			str3[len3++] = str1[i];
			
		}
		for (i = 0; str2[i] != '\0'; i++)
		{
			str3[len3++] = str2[i];
		}
		str3[len3] = '\0';
		printf("%s\n",str3);
		memset(str1,'\0',sizeof(str1));
		memset(str2, '\0', sizeof(str2));
		memset(str3, '\0', sizeof(str3));
	}
	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.

这题codeup一直说编译错误,可是本地编译是可以的,语言也选对了哇,ww!

#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
//const int maxn =85;
//char a[maxn];
int main()
{
	char str[110];
	int i;
	int len;
	while (gets_s(str))
	{
		len = strlen(str);
	
		if ((str[0] <= 'z') && str[0] >= 'a')
			str[0] -= 32;
		for (i = 1; i < len; i++)
		{
			if (((str[i-1]==' ')||(str[i - 1] == '\t')||(str[i - 1] == '\n')|| (str[i - 1] == '\r'))&&(str[i] <= 'z') && str[i] >= 'a')
				str[i] -= 32;		
		}
		printf("%s\n", str);
		memset(str, '\0', sizeof(str));
	}
	return 0;
}

问题 C: 字符串的查找删除
问题描述:给定一个短字符串(不含空格),再给定若干字符串,在这些字符串中删除所含有的短字符串。

  • 输入
输入只有1组数据。
输入一个短字符串(不含空格),再输入若干字符串直到文件结束为止。
  • 输出
删除输入的短字符串(不区分大小写)并去掉空格,输出。
  • 样例输入
in
#include 
int main()
{

printf(" Hi ");
}
  • 样例输出
#clude
tma()
{

prtf("Hi");
}
  • 注意
:将字符串中的In、IN、iN、in删除。

太怪了,还是报编译错误,不管了

#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
//此函数判断两个字符是否相同,不论大小写,如果相同,返回1,如果不同,返回0
int func(char a, char b)
{
	if ((a <= 'Z') && (a >= 'A'))
		a += 32;
	if ((b <= 'Z') && (b >= 'A'))
		b += 32;
	if (a == b)
		return 1;
	else 
		return 0;
}
int main()
{
	char str[110];
	int i,j;
	int len0;
	char str0[10];
	int flag;
	gets_s(str0);
	len0 = strlen(str0);
	while (gets_s(str))
	{
		flag = 0;		
		for(i = 0; i < strlen(str); i++)
		{
			//删除短字符
			if (func(str[i], str0[0]))
			{
				flag = 1;//根据flag判断str里面有没有短字符str0
				for (j = 1; j < len0; j++)
				{
					if (!func(str[i + j], str0[j]))
					{
						flag = 0;
						break;
					}	
				}
				if (flag == 1)
				{
					for (j = 0; i+j < strlen(str); j++)
					{
						str[i + j] = str[i + j + len0];
					}
				}
			}
			//删除空格
			if (str[i] == ' ')
			{
				for (j = i; j < strlen(str); j++)
				{
					str[j] = str[j + 1];
				}
			}			
		}
		printf("%s\n", str);	
		memset(str, '\0', sizeof(str));
	}
	return 0;
}

问题 I: 【字符串】回文串
问题描述:读入一串字符,判断是否是回文串。“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。

  • 输入
一行字符串,长度不超过255
  • 输出
如果是回文串,输出“YES”,否则输出“NO”。
  • 样例输入
12321
  • 样例输出
YES

注意比较回文字符串的下标,i从0开始到<length/2,比较str[i]和str[length-1-i]

#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>

int main()
{
	char s[260];
	int i, length;
	int flag;
	while (scanf("%s",s) != EOF)
	{
		flag = 1;
		length = strlen(s);
		for (i = 0; i < length / 2; i++)
		{
			if (s[i] != s[length - 1 - i])
				flag = 0;
		}
		if (flag == 1)
			printf("YES\n");
		else
			printf("NO\n");
	}
	return 0;
}

PAT B1009 说反话

给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出

  • 输入
测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。
  • 输出
每个测试用例的输出占一行,输出倒序后的句子。
  • 样例输入
Hello World Here I Come
  • 样例输出
Come I Here World Hello

有两种方法,第一种是使用scnaf输入单词,第二种是用gets输入句子,然后再分成单词
下面用第一种方法

#define _CRT_SECURE_NO_WARNINGS 1
#include<cstdio>
#include<cstring>
//const int maxn =85;
//char a[maxn];
int main()
{
	char word[80][80];
	int wordnum;
	char words[80];
	wordnum = 0;
	int num = 0;
	while (scanf("%s", words) != EOF)
	{
		strcpy(word[wordnum++], words);
		//printf("%s", word[num++]);
		memset(words, '\0', sizeof(words));
	}
	for (wordnum = wordnum - 1; wordnum >= 0; wordnum--)
	{
		//printf("!!!");
		printf("%s", word[wordnum]);
		if (wordnum != 0)
			printf(" ");
		else printf("\n");
	}
	//memset(a,'\0',sizeof(a));
	//scanf("%d", &N);
		//scanf("%d %d", &L, &M);
	//printf("%d %d\n", L, M);
		//printf("%d\n", num);

	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值