LINUX 入门 1
day4 20240425
课程链接地址
耗时:2h
p.s. SourceInsight使用 自行搜索
第1章 linux c 单词统计
-
以b.txt为例
按空格判,有问题比如 怎么判 不行
: “Merlin,
-
状态机
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
作业
- 单词跨行,比如diffi-cult怎么判, 上一行结束diffi- 下一行开始cult
- 统计每个单词出现的次数: struct存单词和对应次数,然后还有比较,暂时超出能力范围放弃
c语言基础
-
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
函数接受命令行参数。在函数体内,你可以通过argc
和argv
来访问这些参数,以便根据需要进行处理。