学习记录—情书


一、问题

君君喜欢上了同一个办公室的姜小姐,于是给姜小姐写了一封情书,但他有点担心自己的情书不能充分表达自己的爱意。

请你写一个程序帮君君数一数他的情书里出现了几次单词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,每次调用成功则返回指向被分割出片段的指针。


在这里插入图片描述

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值