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