-
Lesson 1 - 最简单的C程序
-
Lesson 2 - 打印输出
-
Lesson 3 - 循环打印
-
Lesson 4 - 判断奇偶
-
Lesson 5 - 从1加到100求和
-
Lesson 6 - 乘法表
-
Lesson 7 - 求100以内的最大素数
-
Lesson 8 - 1到100有多少个9
-
Lesson 9 - 整型转字符串
-
Lesson 10 - 约瑟夫环
-
Lesson 11 - 求两个坐标点之间的距离
-
Lesson 12 - 判断机器存储是否小尾端
-
Lesson 13 - 对不起,你的车今天限行
-
Lesson 14 - 判断地图上某点是否有出路
-
Lesson 15 - 统计一个数二进制表示中1的个数
-
Lesson 16 - 字符串拷贝
-
Lesson 17 - 统计单词个数
-
Lesson 18 - 实现 printf
-
Lesson 19 - 命令解释器
-
Lesson 20 - 预处理器实现
-
Lesson 21 - 词法分析器实现
-
Lesson 22 - 猜数游戏
-
Lesson 23 - 五子棋
-
Lesson 24 - 超链接分析器
-
Lesson 25 - cp命令实现
-
Lesson 26 - ELF文件头分析器实现
-
Lesson 27 - 简单流处理器实现和正则表达式
-
Lesson 28 - 数学计算器实现
-
Lesson 29 - 数学计算器实现more命令实现
-
Lesson 30 - sort命令实现
-
Lesson 31 - ls -l命令实现
-
Lesson 32 - Bash项目
-
Lesson 33 - 动态数组实现
-
Lesson 34 - 约瑟夫环问题
-
Lesson 35 - 表达式求值问题
-
Lesson 36 - 广度优先解决迷宫问题
-
Lesson 37 - 词频统计器
-
Lesson 38 - 堆排序问题
-
Lesson 39 - 构造符号表
-
Lesson 40 - MyDictionary项目
-
Lesson 41 - BSearch 实现
-
Lesson 42 - QSort 实现
-
Lesson 43 - 深度优先解决迷宫问题
-
Lesson 44 - KMP 算法实现
-
Lesson 45 - 最长公共子序列(LCS)问题
-
Lesson 46 - Dijkstra 算法
-
Lesson 47 - Huffman Coding 算法
-
Lesson 48 - 地图导航项目
Lesson 19 Shell command parser 命令解释器
#include <stdio.h>
#include <string.h>
int shell_parse(char * buf, char * argv[])
{
int argc = 0;
int state = 0;
while (*buf)
{
if (*buf != ' ' && state == 0)
{
argv[argc++] = buf;
state = 1;
}
if ((*buf == ' ') && state == 1)
{
*buf = '\0';
state = 0;
}
buf++;
}
return argc;
}
int do_cmd(int argc, char ** argv)
{
int i;
printf("argc = %d\n", argc);
for (i = 0; i < argc; i++)
printf("argv[%d]: <%s>\n", i, argv[i]);
return 0;
}
int do_add(int argc, char ** argv)
{
printf("help: this is a add function with %d args\n", argc - 1);
return 0;
}
int do_sub(int argc, char ** argv)
{
printf("ls: this is a sub function with %d args\n", argc - 1);
return 0;
}
int (*pf)(int argc, char ** argv);
int main(void)
{
char buf[64];
int argc = 0;
char * argv[10];
printf("$ ");
fgets(buf, 64, stdin);
buf[strlen(buf)-1] = '\0';
printf("<%s>\n", buf);
argc = shell_parse(buf, argv);
pf = do_cmd;
if (strcmp(argv[0], "add") == 0)
pf = do_add;
if (strcmp(argv[0], "sub") == 0)
pf = do_sub;
pf(argc, argv);
//callback(pf,argc, argv);
return 0;
}
copy
语法知识点
- 指针数组
- 指向指针的指针
- 函数指针
课堂讨论
- gets, scanf 和 fgets 在使用中有什么区别?需要注意什么?
- 函数指针类型,如果用 typedef 怎么声明?
- 指针数组 char * argv[10] 和指向指针的指针 char ** argv 有何区别?
课后练习
- 修改这个程序,使得它能够支持 add 和 sub 命令,可以实现整数的加法和减法。
- 如果把最后的注释打开,通过 callback 函数来调用 pf 函数指针所指向的函数,请实现这个回调函数。
- 分别实现整数和浮点数的加法函数 add_int() 和 add_float() ,在命令解释器利用 void * 函数指针来实现两种类型数的加法命令 add
- 通过函数指针数组,可以实现命令解释器的命令自动匹配和执行,请实现这个想法。提示:采用结构体数组来实现。