吃火锅问题

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值