C语言字符串函数


strcpy

char* strcpy(char * dest, char* src);
是一个将存放在src里的字符串复制到dest的字符串里的函数;它的返回值是dest。需要注意的是,strcpy在复制字符串时会自动在末尾加上\0,
因此dest的长度必须比src多至少 1 个字符;如果dest的长度小于这个长度,你就会在运行时碰到 段错误(Segmentation Fault) 。这个看似很小的问题可能会导致你 debug 到凌晨三点,所以绝不要忘记!

strlen

size_t strlen(const char* str);
这个函数在输入的字符串str中寻找\0,返回从第一个字符到第一个\0的长度(不包括\0)。注意,如果你用一个长度为 \ 100 100 的数组存储了一个实际长度只有 \ 5 5 的字符串,strlen会返回 \ 5 5,而不是 \ 100 100。

strcat

char* strcat(char* dest, char* src);
它可以将src里存储的字符串接到dest的后面,它的返回值也是dest。

strcmp

int strcmp(char* str1, char* str2);
这个函数可以比较两个字符串是否完全一致。如果函数返回 0,则表示两个输入的字符串完全一致;如果函数返回值大于 0,则str1与str2第一个分歧的字符处,str1的字符比str2的同位置字符对应更大的值(你可以参考 ASCII 表格来找到每个字符唯一对应的整数);否则str2的第一个分歧字符大于str1的第一个分歧字符。

strtok

char* strtok(char* str, const char* delimiters);
这个函数将输入的字符串str用输入的分隔符delimiters分为更短的字符串。delimiters是一个含有多个字符的字符串,其中每一个字符都是一个独立的分隔符。如\n\t中\n和\t分别可以作为独立的分隔符。需要注意的是,strtok会修改输入的字符串str;因此如果你想保留原有的字符串,最好先用strcpy将原有的字符串复制到另一个字符串里,然后再将字符串输入到strtok里分割。当我们将一个字符串str输入到strtok里后,strtok会返回一个指向第一个由非分隔符字符的指针的分割片段;之后的每一次调用,我们都会把NULL作为第一个参数,如果调用成功就会返回下一个分割片段,如果已经到达str的末尾则会返回NULL。

题目

小开喜欢上了同一个办公室的小虹,于是给小虹写了一封情书,但他有点担心自己的情书不能充分表达自己的爱意。请你写一个程序帮小开数一数他的情书里出现了几次单词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.Happy

样例输出

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
Happy
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.Happy

代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.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 *tp_str = (char*)malloc(strlen(str) + 1);
    int cnt = 0;
    tp_str = strcpy(tp_str, str);
    //char* dim = malloc(9);
    char* dim = " \t\n\r\"\',.";
    // dim[0] = ' ';
    // dim[1] = '\t';
    // dim[2] = '\n';
    // dim[3] = '\r';
    // dim[4] = '\"';
    // dim[5] = '\'';
    // dim[6] = ',';
    // dim[7] = '.';
    // dim[8] = '\0';
    char* s = strtok(tp_str, dim);
    while (s != NULL) {
        printf("%s\n", s);
        if (strcmp(s, "love") == 0) ++cnt;
        s = strtok(NULL, dim);
    }
    printf("%d\n", cnt);
    free(tp_str);
    // free(dim);    
    puts(str);

    return 0;
}

#undef MAX_LENGTH

文章作者: Axieyun
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Axieyun !
评论
评论
  目录