L1-070 吃火锅 (15 分) C语言

L1-070 吃火锅 (15 分)

在这里插入图片描述
以上图片来自微信朋友圈:这种天气你有什么破事打电话给我基本没用。但是如果你说“吃火锅”,那就厉害了,我们的故事就开始了。

本题要求你实现一个程序,自动检查你朋友给你发来的信息里有没有 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
-_-#

代码如下:

#include<stdio.h>
#include<string.h>
int main()
{
	char a[81],b[15]="chi1 huo3 guo1";
	int total=0,first=-88,total_now=0;
	char *p;
	while(1) 
	{
		gets(a);
		if(strcmp(a,".")==0)
		break;
		total++;
		p = strstr(a,b);
		if(p!=NULL)
		{
			total_now+=1;
			if(first<0)
			{
				first=total;
			}
		}	
	}
	printf("%d\n",total);
	if(total_now!=0)
		printf("%d %d\n",first,total_now);
	else
		printf("-_-#");
	return 0;
}
<think>好的,我现在要处理用户关于“PTA C++ 吃火锅”相关编程题的询问。首先,我需要回忆一下PTA平台上的题目,特别是涉及字符串处理的题目。用户之前提到的L1-070题是关于吃火锅的,引用[2]中提供了C语言的参考代码,但用户现在可能想要C++的实现。 首先,我应该先确认题目的具体要求。根据引用[2]中的代码,题目的大意是统计多条信息中首次出现“chi1 huo3 guo1”的位置以及总共有多少次提到火锅。输入以单行的“.”结束。输出包括总信息数、首次出现的位置(如果有的话)以及总次数。 接下来,我需要将C代码转换为C++。C++中可以使用string类来处理字符串,这样会更方便。例如,使用getline来读取每一行输入,而不是C中的gets。此外,在C++中检查子字符串是否存在可以用string的find方法,这样就不需要像C那样手动复制子串进行比较。 然后,考虑代码的结构。需要循环读取输入,直到遇到单行的“.”。每读取一行,就检查是否包含目标字符串“chi1 huo3 guo1”。如果是第一次出现,记录当前的信息条数。同时统计总共有多少条这样的信息。 需要注意的是,C++的字符串处理可能和C有所不同,比如strncpy在C++中可能需要用substr来代替。另外,处理输入时要注意换行符的问题,尤其是在混合使用cin和getline时,可能需要清除缓冲区。 另外,题目中的输出格式也要注意。当没有找到任何火锅信息时,输出总信息数后跟“-_-#”。如果有,则输出总信息数、首次位置和总次数。 现在,我需要确保转换后的C++代码能够正确处理这些情况。例如,使用string的find方法,如果找到子字符串的位置,则进行计数。同时,每次读取输入时,信息条数要递增,直到遇到“.”为止。 可能遇到的错误包括:未正确处理输入终止条件,或者在查找子字符串时的逻辑错误。比如,是否区大小写?题目中的示例是“chi1 huo3 guo1”,所以应该是精确匹配,包括数字和字母的大小写。 最后,测试一下代码是否符合样例输入输出。比如,当输入包含多个包含目标字符串的行时,是否能正确统计首次出现的位置和总次数。同时,当输入中没有目标字符串时,输出是否正确。 总结下来,步骤是: 1. 读取输入,直到遇到“.”。 2. 对每行输入检查是否包含特定子串。 3. 统计总信息数、首次出现位置和总次数。 4. 根据统计结果输出正确格式。 现在,我需要将上述思路转化为C++代码,并确保符合PTA的提交要求。</think>### PTA L1-070 吃火锅题解(C++实现) #### 题目要求 统计多条信息中首次出现`chi1 huo3 guo1`的序号和总出现次数,输入以`.`结束。输出格式: - 若未找到:`总信息数\n-_-#'` - 若找到:`总信息数\n首次位置 总次数` #### C++实现代码 ```cpp #include <iostream> #include <string> using namespace std; int main() { string line; int total = 0; // 总信息数 int first = 0; // 首次出现位置 int count = 0; // 总匹配次数 while (getline(cin, line)) { if (line == ".") break; // 输入终止条件 total++; // 查找子字符串 if (line.find("chi1 huo3 guo1") != string::npos) { count++; if (count == 1) first = total; // 记录首次出现位置 } } cout << total << endl; if (count == 0) { cout << "-_-#" << endl; } else { cout << first << " " << count << endl; } return 0; } ``` #### 代码解析 1. **输入处理** 使用`getline`逐行读取输入,遇到`.`时终止循环。`total`变量记录总信息条数。 2. **字符串匹配** 通过`string::find`方法检查每行是否包含`chi1 huo3 guo1`,若找到则更新`count`和`first`[^2]。 3. **输出逻辑** 根据`count`的值选择输出格式,未匹配时输出特殊标记`-_-#`。 #### 关键知识点 - `string::find`返回值:若找到返回位置索引,否则返回`string::npos`。 - `getline`用法:读取整行输入(包含空格),自动处理换行符。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大菜彩

家人们鼓励鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值