吃火锅问题

本题要求你实现一个程序,自动检查你朋友给你发来的信息里有没有 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"这个关键词,则输出表情 -_-#。

接下来,我将给出一个表格,列出可能出现的问题和对应的解决方案。

情况问题
输入为空提示用户输入朋友信息
朋友信息中没有句点"."提示用户输入句点"."来结束输入
信息行超过80个字符提示用户每行信息不超过80个字符
信息中包含非法字符提示用户信息只能包括字母、数字、空格、半角标点符号
没有出现"chi1 huo3 guo1"这个关键词输出表情 -_-#

对于每个问题,我们可以在代码中添加相应的输入验证和错误处理逻辑来解决。

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

#define MAX_LENGTH 81

int main() {
  char message[MAX_LENGTH];
  int totalCount = 0;
  int count = 0;
  int firstIndex = -1;

  // 读取朋友信息直到遇到句点
  while (fgets(message, MAX_LENGTH, stdin) != NULL) {
    // 去掉结尾的换行符
    message[strcspn(message, "\n")] = '\0';

    // 判断信息是否为空行
    if (strlen(message) == 0) {
      continue;
    }

    // 判断是否遇到句点
    if (strcmp(message, ".") == 0) {
      break;
    }

    totalCount++;

    // 判断信息是否包含"chi1 huo3 guo1"
    if (strstr(message, "chi1 huo3 guo1") != NULL) {
      count++;
      if (firstIndex == -1) {
        firstIndex = totalCount;
      }
    }
  }

  // 输出统计结果
  printf("%d\n", totalCount);
  if (count == 0) {
    printf("-_-#\n");
  } else {
    printf("%d %d\n", firstIndex, count);
  }

  return 0;
}

fgets是C语言中的一个函数,用于从输入流中读取一行字符串。它的原型定义如下:

char *fgets(char *str, int n, FILE *stream)

参数说明:

  • str:指向一个字符数组的指针,用于存储读取到的字符串。
  • n:指定要读取的最大字符数(包括空字符'\0'),即字符数组的长度。
  • stream:指定要从中读取字符串的输入流,通常是stdin表示标准输入。

函数的返回值为str,即读取到的字符串。如果成功读取到字符串,则返回值为str,如果读取失败(例如到达文件结尾或发生错误),则返回值为NULL

fgets函数会读取输入流中的一行字符,包括换行符,然后将其存储到str所指向的字符数组中。如果输入行的字符数大于等于n-1,则会将剩余的字符留在输入流中,以供下次输入读取。

这个函数在读取字符串时会保留换行符,所以需要注意处理换行符的情况。

message[strcspn(message, "\n")] = '\0'; 这行代码的作用是将字符串 message 中的换行符(\n)替换为空字符(\0),从而去掉字符串末尾的换行符。

strcspn() 函数是 C 语言标准库中的一个字符串函数,用于计算字符串 message 中首次出现指定字符集合中的任意字符的位置索引。在这里,我们将字符集合指定为换行符(\n),即 "\n"

strcspn(message, "\n") 的返回值是字符串 message 中首次出现换行符的位置索引。然后,我们将该位置索引对应的字符赋值为空字符 '\0',从而将换行符替换为空字符。

这样做的目的是为了去掉字符串末尾的换行符,以便后续处理字符串的时候不受影响。在使用 fgets() 函数读取一行字符串时,它会将换行符一起读取进来,而我们通常希望处理的字符串不包含换行符。

strstr 是 C 语言标准库中的一个字符串函数,用于在一个字符串中查找另一个字符串的第一次出现位置。

strstr 函数的原型定义如下:

char *strstr(const char *haystack, const char *needle)

参数说明:

  • haystack:要在其中进行搜索的字符串。
  • needle:要查找的目标字符串。

函数的返回值为指向第一次出现目标字符串的位置的指针。如果找到目标字符串,则返回指向该位置的指针;如果未找到目标字符串,则返回 NULL

在上述代码示例中,我们使用了 strstr 函数来判断朋友的每一行信息中是否包含 "chi1 huo3 guo1" 这个关键词。通过调用 strstr(message, "chi1 huo3 guo1"),如果返回值不为 NULL,说明目标字符串找到了,即该行信息中包含了 "chi1 huo3 guo1" 这个关键词。

<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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值