LINUX 入门 1

LINUX 入门 1

day4 20240425

课程链接地址
耗时:2h

p.s. SourceInsight使用 自行搜索

第1章 linux c 单词统计

  1. 以b.txt为例

    按空格判,有问题比如 怎么判 不行

    : “Merlin,
    
  2. 状态机

    in:字符在单词内

    out: 初始状态,字符在单词外

    字母跳到in,非字母跳到out

    在这里插入图片描述

    统计单词(不是字母,所以用状态改变判断)个数->统计状态out变成In多少次

    #include<stdio.h>
    
    
    #define OUT 0
    #define IN 1
    #define INIT OUT
    
    
    int count_word(char *filename){
        int status = INIT;
        FILE *p = fopen(filename, "r");
        if (fp == NULL)  return -1; //在C语言中,FILE 是一个数据类型,用于表示文件流(file stream)。它通常用于打开、读取和写入文件。
    
        // 一个个字符读入,文件结尾EOF
        char c; 
        int word = 0;
        while( (c = fgetc(fp)) != EOF){
            if((c == ' ')  || (c == '\t') || (c == '\n')){
                status = OUT;
            }
            else if (status = OUT){
                // 这里要写条件,因为统计单词,不是字母个数
                status = IN;
                word ++;
            }
                
        }
        return word;
    }
    
    
    
    int main(int argc, char ** argv[]){
    
        if(argc < 2)  return -1;
        count_word(argv[1]);
    }
    
    

    编译 每次修改保存后要重新编译

    gcc -o count_me count_me.c
    ./count_me b.txt
    

    输出

    word: 113586
    

    测试 a.txt里有漏洞 补全分隔符 \转义符

    ' ' '\n' '\t' '\"' '\'
    
    don't算2个单词 don是一个 t是一个
    

    but问题来了,分隔符太多了比如!,? .等等, 单独拎出来一个func split

    #include<stdio.h>
    
    
    #define OUT 0
    #define IN 1
    #define INIT OUT
    
    int split(char c){
        if((' ' == c) || ('\n' == c) || ('\t' == c) ||
    			('\"' == c) || ('\'' == c) || ('+' == c) ||
    			(',' == c) || (';' == c) || ('.' == c))
    			return 1;
        else
            return 0;
    }
    int count_word(char *filename){
        int status = INIT;
        FILE *fp = fopen(filename, "r");
        if (fp == NULL)  return -1; //在C语言中,FILE 是一个数据类型,用于表示文件流(file stream)。它通常用于打开、读取和写入文件。
    
        // 一个个字符读入,文件结尾EOF
        char c; 
        int word = 0;
        while( (c = fgetc(fp)) != EOF){
            if(split(c)){
                status = OUT;
            }
            else if (status == OUT){
                // 这里要写条件,因为统计单词,不是字母个数
                status = IN;
                word ++;
            }
                
        }
        return word;
    }
    
    
    
    int main(int argc, char* argv[]){
    
        if(argc < 2)  return -1;
        printf("word: %d\n", count_word(argv[1]));
    }
    

    输出

    word: 1156839
    

作业

  1. 单词跨行,比如diffi-cult怎么判, 上一行结束diffi- 下一行开始cult
  2. 统计每个单词出现的次数: struct存单词和对应次数,然后还有比较,暂时超出能力范围放弃

c语言基础

  1. int main(int argc, char* argv[])
    

    这里的例子 明白了吗,还行不太难

    ./count_me b.txt
    
    argc = 2
    argv[0] = "./count_me"
    argv[1] = "b.txt"
    

    参数 argc 是指命令行参数的数量(argument count),而 argv 是一个指向字符指针数组的指针,用来存储每个命令行参数(argument vector)的值。常见的用法是:

    • argc:表示命令行中的参数数量,包括程序名称本身。因此,如果没有提供参数,argc 将为 1。
    • argv:是一个指针数组,其中每个元素是一个指向以空字符终止的字符串的指针,这些字符串是命令行参数的值argv[0] 存储的是程序的名称,argv[1] 存储的是第一个参数,依此类推。

    因此,int main(int argc, char* argv[]) 函数签名表示 main 函数接受命令行参数。在函数体内,你可以通过 argcargv 来访问这些参数,以便根据需要进行处理。

  • 27
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值