程序片段(01):TestCmd.c
内容概要:管道_字符串
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//01.管道:Windows应用程序与DOS系统之间的通信桥梁
// 1.用于进程之间的通信(两个进程:窗体进程+cmd进程)
// 2.窗体进程发送指令到cmd进程进行执行;
// 然后将cmd进程执行之后的结果反馈到当前窗体进程
//注:C语言将所有的设备都可以当做文件进行处理!(很重要)
int exeShell(char * cmd, char * result)
{
//通过管道让cmd进程执行窗体进程向cmd进程发送的指令,并通过管道返回指令执行结果到窗体进程
FILE * pf = _popen(cmd, "r");//以读取的模式打开一个管道,用管道的另一端执行一个cmd指令并反馈执行结果
//1.打开进程之间通信的管道,进程管道用于进程之间的信息传递,可以向进程管道的另外一端(cmd进程)发送一个指令
// 等待该指令的执行结果反馈,然后再做对指令执行结果的信息处理(窗体进程)
//2.在Windows系统当中,操作各种设备的时候,都可以将各种设备当做文件系统进行处理(设备概念-->文件概念)
// C语言的文件概念模拟设备要点!(操作文件就等同于操作设备)-->需要_popen();函数进行文件模拟!
if (NULL == pf)
{
printf("窗体进程和cmd进程之间的通信管道创建失败! \n");
return 0;
}
while (!feof(pf))//到达文件结尾返回1,没有到达文件结尾返回0
{
char str[256] = { 0 };//信息读取字符缓冲区
if (fgets(str, 256, pf))//fgets();函数的返回值就是通过管道进行进程通信所读取到的字符个数
{
//进行进程通信信息的拼接:通过strcat函数不断的进行拼接动作,每次拼接都是采取替换字符串标识'\0'的方式进行拼接
strcat(result, str);//拼接字符串信息,构成完整信息体(逐步读取文件,构建完整文件体)
}
}
_pclose(pf);//关闭进程之间的通信管道,避免过度占用资源
return 1;
}
int main01(void)
{
char str[1024];
gets(str);//获取键盘录入的字符串,并存储到参数所指定的字符串当中特点:只以回车作为录入结束标识符!
puts(str);
system("pause");
}
int main02(void)
{
char result[1024 * 8] = { 0 };//8M尺寸的字符串缓冲区
if (exeShell("tasklist", result))
{
//如果执行脚本成功,就输出脚本的执行结果信息
printf("%s \n", result);
}
//判断某个进程是否正在操作系统之上运行
//char * p = strstr(result, "QQ.exe");
//if (NULL != p)
//{
// printf("QQ正在执行当中! \n");
//}
//else
//{
// printf("QQ未在执行当中! \n");
//}
int i = 0;
//统计QQ进程的执行个数,找到返回地址,未找到返回NULL
for (char * p = strstr(result, "QQ.exe"); NULL != p; strstr(p + 6, "QQ.exe"))
{
++i;
printf("QQ运行了%d个! \n", i);
}
system("pause");
}
int main03(void)
{
char cmd[128] = { 0 };
char result[1024 * 8] = { 0 };
//gets(cmd);//只以\n作为录入状态结束标识符!
scanf("%[^\n]", cmd);//%[^\n]正则表达式+scanf();函数-->只以\n作为扫描结束标识符
puts(cmd);
if (0 != exeShell(cmd, result))
{
printf("%s \n", result);
}
system("pause");
}
//1.tree Directory:用于将某个目录以树状形式进行显示,以及用于扫描某个地址(搜索文件的最佳方式!)-->避免使用递归遍历!
//2.netstat -a:用于显示所有的TCP/UDP协议信息,用于显示网络链接状态,本地客户端与服务器之间的联系
//3.ftp:都可以用命令行进行操作,这个操作的特点就是可以用于进行WiFi密码的破解,因为匹配密码的时候都会通过命令行发送一系列密码字典,我们可以采用密码字典进行密码的破解
//4.管道的特点:进程之间的通信桥梁,Windows操作设备都是将设备看做为文件系统进行的操作;管道既可以用于操作文件也可以用于操作系统设备
//5.strstr();的读取特点,会从首地址不断的进行数据的比对,只要检索到一个就停止检索状态
//6.scanf();和gets();的不同点:scanf();不会处理空格,Tab键盘,gets();会进行空格的处理读取
程序片段(02):PrintF.c
内容概要:PrintF可变参数
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>//可变参数使用头文件
//01.可变参数的使用特点:
// 1.包含可变参数头文件:
// #include <stdarg.h>
// 2.可变参数列表描述符:
// ...-->代表可变参数列表
// 3.可变参数列表的特点: