PTA L1-070 吃火锅 c语言详解

目录

L1-070 吃火锅

一、解题思路

使用strcmp()函数

 题解

使用strstr()函数

 题解

最终题解如下:

总结


L1-070 吃火锅

本题要求你实现一个程序,自动检查你朋友给你发来的信息里有没有 

chi1 huo3 guo1

输入格式:

输入每行给出一句不超过 80 个字符的、以回车结尾的朋友信息,信息为非空字符串,仅包括字母、数字、空格、可见的半角标点符号。当读到某一行只有一个英文句点 . 时,输入结束,此行不算在朋友信息里。

输出格式:

首先在一行中输出朋友信息的总条数。然后对朋友的每一行信息,检查其中是否包含 chi1 huo3 guo1,并且统计这样厉害的信息有多少条。在第二行中首先输出第一次出现 chi1 huo3 guo1 的信息是第几条(从 1 开始计数),然后输出这类信息的总条数,其间以一个空格分隔。题目保证输出的所有数字不超过 100。

如果朋友从头到尾都没提 chi1 huo3 guo1 这个关键词,则在第二行输出一个表情 -_-#

输入样例 1:

Hello!
are you there?
wantta chi1 huo3 guo1?
that's so li hai le
our story begins from chi1 huo3 guo1 le
.

输出样例 1:

5
3 2

输入样例 2:

Hello!
are you there?
wantta qi huo3 guo1 chi1huo3guo1?
that's so li hai le
our story begins from ci1 huo4 guo2 le
.

输出样例 2:

5
-_-#

一、解题思路

①本题的思路一片明朗啊,就是输入很多很多行(不知道多少行),然后以字符'.'结束。再判断一下这很多行中有几行包含chi1 huo3 guo1。最后输出总行数(不包括'.'),第一次出现chi1 huo3 guo1的行数和包含这类信息的所有条数。

②本题的算法不难,难点主要在于怎么以'.'结束这好多好多行,然后在这好多好多行中找出字符串chi1 huo3 guo1并记录这些行数。

这里我们可以使用c语言函数库里的string()类型的函数,导入头文件#include<string.h>来帮助我们快速解决问题。

解决怎么以'.'结束这好多好多行

使用strcmp()函数

strcmp(a,b),比较a,b字符串的大小
若b>a则返回-1
若b<a则返回1
若a==b则返回0

注意:strcmp()函数并不是比较字符串的长度,而是比较字符串里每个字符的ASCII码值。

例如:

a[4]="ABC";

b[4]="abc";

strcmp(a,b);

比较过程为字符串a的每个字符的ASCII码值减去对应字符串b的ASCII码值,若差值为0就进行下一个比较,否则返回差值,再进行下一个比较,最后返回总差值:

('A'-'a')的ASCII码值=-32  //sum=-32

('B'-'b')的ASCII码值=-32  //sum=-32+(-32)

('C'-'c')的ASCII码值=-32  //sum=-64+(-32)

④最后返回-96(即sum的值)

⑤strcmp()函数值则返回-1

所以就可以得出结论strcmp(a,b)的结果为b比a大,strcmp(a,b)=-1

#include<stdio.h>
#include<stdio.h>
int main()
{   
   char a[4]="ABC";
   char b[4]="abc";
   printf("%d",strcmp(a,b));
 return 0;
}
-1

 题解

所以题目要求的以字符'.'结束,就很好解决了。用一个while语句加上strcmp()就OK了。

例如:

#include<stdio.h>
#include<string.h>
int main()
{   int i;
   	char xinxi[100][81];
		gets(xinxi[0]);
		while(strcmp(xinxi[i],".")!=0){
			i++;
			gets(xinxi[i]);
		}
 return 0;
}

比较字符串xinixi[i]只要与字符'.'的返回值只要不为0,就一直运行,否则就停止运行。

解决怎么在这好多好多行中找出字符串chi1 huo3 guo1并记录这些行数

使用strstr()函数

strstr()
strstr(a,b)判断b字符串是否为a字符串的子串,

b是a子串的话,就返回b在a首次出现的地址,否则返回NULL

注意:在使用strstr()函数时,b的长度一定是要比a小的。不然b咋是a的子串,那该反过来a是b子串了(doge)

例如:

char a[10]="ABCabc123";

char b[4]="abc";

strstr(a,b)

返回的值为一个字符串即:"abc123";

#include<stdio.h>
#include<string.h>
int main()
{   
   char a[11]="ABCabc123";
   char b[4]="abc";
   printf("%s",strstr(a,b));
 return 0;
}
abc123

若b不是a的字串就返回NULL

例如:

char a[10]="ABCabc123";

char b[4]="abD";

strstr(a,b)

#include<stdio.h>
#include<string.h>
int main()
{   
   char a[11]="ABCabc123";
   char b[4]="abD";
   printf("%s",strstr(a,b));
 return 0;
}
(null)

 题解

所以题目中如何找出字符串chi1 huo3 guo1并记录行数就很简单了。我们需要稍微改变一下思路,这里不需要找到 chi1 huo3 guo1的位置,只需要判断它是不是为空(NULL)就行了。

if(strstr(xinxi[j],"chi1 huo3 guo1")!=NULL){
				count++;//记录包含目标字符串的总行数
				if(count==1){//如果count第一出现的话 就直接打印输出
				printf("%d ",j+1);
				}

最终题解如下:

#include <stdio.h>
#include <string.h>
int main() {
		char xinxi[100][81];
		int i=0,j=0,count=0;
		gets(xinxi[0]);
		while(strcmp(xinxi[i],".")!=0){//不为.就一直循环输入
			i++;
			gets(xinxi[i]);
		}
		printf("%d\n",i);
		while(i--){//i为总行数,自减到0停止循环
			if(strstr(xinxi[j],"chi1 huo3 guo1")!=NULL){
				count++;//记录包含目标字符串的数量
				if(count==1){//若为第一次出现就打印此时的位置
				printf("%d ",j+1);//因为j是从0开始的,而题目要求从1开始计数,所以行数要加一
				}
			}
		j++;//行数下标
		}
		if(count!=0){
			printf("%d",count);
		}
		else
			printf("-_-#");
	return 0;
}

由于博主水平有限,加上博主还是个小萌新,写的算法难免累赘青涩,描述上也可能有很多错误,还请各位大佬多多包含和指正,写此博客仅为记录自己的学习路程,也同时欢迎小伙伴们提出疑问,我们共同进步!

总结

以上就是今天要讲的内容,本文主要完成了吃火锅题目,,和简单介绍了strstr()函数和strcmp()的使用方法,希望对各位小伙伴们有所帮助,谢谢。

  • 23
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值