一、问题
君君喜欢上了同一个办公室的姜小姐,于是给姜小姐写了一封情书,但他有点担心自己的情书不能充分表达自己的爱意。
请你写一个程序帮君君数一数他的情书里出现了几次单词love(不忽略大小写,仅统计小写)。
为了找出单词love,我们需要把情书分割为一个个单词,然后统计单词love出现的次数,最后为了方便蒜头君检查,我们还要附上情书原文。
读取情书和输出原文,拆分单词和统计出现次数。
二、格式&样例
输入格式
一个长度不超过 256 个字符的字符串,字符串中的单词由且仅由
空格、\t、\n、\r\n、"、'、
,或.
分隔开。
输出格式
先按照顺序输出情书中出现的所有单词(不排除重复),每个占一行,然后输出一个整数(占一行),代表输入字符串中love出现的次数。最后输出情书的内容。
样例
输入
I love you so much, Ms.Ginger.
My love is like a flame burning in my heart, making it difficult for me to think about anyone but you.
Please accept my love.
With love,
Mr.Garlic
输出 1
I
love
you
so
much
Ms
Ginger
My
love
is
like
a
flame
burning
in
my
heart
making
it
difficult
for
me
to
think
about
anyone
but
you
Please
accept
my
love
With
love
Mr
Garlic
4
I love you so much, Ms.Ginger.
My love is like a flame burning in my heart, making it difficult for me to think about anyone but you.
Please accept my love.
With love,
Mr.Garlic
三、拆分字符串函数
分解字符串为一组字符串,
str
是要分解的字符串,delim
是分隔符
char* strtok(char* str, const char* delimiters);
解释:
函数将输入的字符串str
用输入的分隔符dilimiters
分为更短的字符串。delimiters
是一个含有多个字符的字符串,其中每一个字符都是一个独立的分隔符。如\n\t
中\n
和\t
分别可以作为独立的分隔符。
需要注意的是,strtok
会修改输入的字符串str
;因此如果你想保留原有字符串,最好先用strcpy
将原有的字符串复制到另一个字符串里,然后再将字符串输入到strtok
里分割。
当我们将一个字符串str
输入到strtok
里后,strtok
会返回一个指向第一个由非分隔符字符的指针的分隔片段;之后的每一次调用,我们都会把NULL
作为第一个参数,如果调用成功就会返回下一个分隔片段,如果已经到达str
末尾则会返回NULL
。
梳理:
1、strtok()
用来将字符串分割成一个个片段。
2、参数s指向欲分割的字符串,参数delim
则为分割字符串中包含的所有字符。
3、当strtok()
在参数s的字符串中发现参数delim
中包含的分割字符时,则会将该字符改为\0
字符。
4、在第一次调用时,strtok()
必需给予参数s字符串,返回指向第一个分割片段的指针。
5、往后的每一次调用则将参数s设置成NULL
。每次调用成功则返回指向被分割出片段的指针。
代码实现
#include <stdio.h>
#include <string.h>
const int MAX_LENGTH = 256;
char* get_letter(void) {
static char letter[1000000];
letter[999999] = ' ';
char *p = letter;
int size = MAX_LENGTH;
while (feof(stdin) == 0) {
if (size == 0) {
break;
}
fgets(p, size + 1, stdin);
while (*p != '\0') {
p++;
size--;
}
}
return letter;
}
int main() {
char *str = get_letter();
// 在此处添加你的代码
char temp[1000001];
strcpy(temp, str);
char *p;
p = strtok(temp, " \t\n\r\n\"\',.");
int count = 0;
while (1)
{
if (p == NULL)
{
break;
}
printf("%s\n", p);
if (strcmp(p, "love") == 0)
count++;
p = strtok(NULL, " \t\n\r\n\"\',.");
}
printf("%d\n", count);
//printf("%s", temp);
//strtok(temp, "\t\n\r\n\"\',.");
puts(str);
return 0;
}
#undef MAX_LENGTH
四、总结
注意
除了第一次调用必需给予参数s
字符串,往后的每一次调用则将参数s设置成NULL
,每次调用成功则返回指向被分割出片段的指针。