目录
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()的使用方法,希望对各位小伙伴们有所帮助,谢谢。