C的函数,变量声明,malloc,MessageBox,sprintf,简单应用

来源:互联网 发布:edrawmax mac 注册码 编辑:程序博客网 时间:2024/05/01 10:21

函数声明

一.原因

c是按顺序执行的,当被调用函数定义在主调函数的后面,

而主调函数不能标识这个还未遇到过的函数,

∴需要在主调函数前声明被调用的函数,来通知被调函数的存在
二.位置
(1)函数内:则只能在此函数中标识
(2)函数外:则从声明点以后的函数,均能标识
(定义在函数外的,一般定义在源文件首部)
Eg:

#include<stdio.h>void test(int i);//声明函数void main(){test(1);}void test(int i){}

三.格式:可以省略形参名,甚至形参类型
(但省形参类型,编译器就不能检查实参和形参是否匹配, ∴建议最好不要省略)
四.注意:与定义不同,函数声明可以反复,变量声明在函数外可以反复
Ps:在函数外声明的变量为全局变量

MessageBox函数

一.作用:创建显示操作消息对话框
二.适用:Visual Basic 6.0)
三.参数
hWnd:
指定该对话框的所有者窗口。如果该参数为空(0),则该对话框不属于任何窗口(?)。
lpText:
显示在对话框中的消息。
lpCaption:
在对话框标题栏中显示的字符串表达式。如果该参数为空(vbNullString),则使用默认的“错误”作为对话框的标题。
wType:
指定显示按钮的数目及形式,使用的图标样式,缺省按钮是什么以及消息框的强制回应等。可以为下列常数之一或某几个数值相加的和。
指定按钮样式,
指定图标样式,
指定默认按钮,
四.返回值
如果没有足够内存创建消息对话框,则返回0。
如果函数成功运行,则返回:点击的相应按钮
五.与MessageBoxAMessageBoxW的区别:
MessageBox其实是在库里声明了一个宏
当使用宽字符,即unicode时,自动转换用MessageBoxW
当使用窄字符时,会自动帮转换用MEssageBoxA
即当宽窄不相同的时候编译器会自动帮你转换
∴基本没区别

sprintf变参函数

一.定义:字符格式化命令
二.主要功能:把格式化的数据写入某字符串缓冲区
三.头文件:stdio.h
四.参数列表
buffer: char型指针,指向将要写入的字符串的缓冲区。
format: 格式化字符串。
[argument]…: 可选参数,可以是任何类型的数据。
五.返回值
返回写入buffer 的字符数,出错则返回-1.

若buffer 或 format 空指针,且不出错而继续,函数将返回-1,
并且 errno 会被设置为 EINVAL。

sprintf 返回被写入buffer 的字节数,结束字符‘\0’不计入内。
即,如果“Hello”被写入空间足够大的buffer后,函数sprintf 返回5

malloc函数

一.作用:向系统申请分配指定size个字节的内存空间
二.返回类型: void* 类型。void* 表示未确定类型的指针。
C,C++规定,void* 类型可以强制转换为任何其它类型的指针。
三.返回值
分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回NULL。
当内存不再使用时,应使用free()函数将内存块释放。
函数返回的指针一定要适当对齐,使其可以用于任何数据对象。
四.原型
extern void *malloc(unsigned int num_bytes);
以前malloc返回char型指针,新的ANSIC标准规定,该函数返回为void型指针,因此必要时要进行类型转换。
五.头文件

#include <stdlib.h>#include <malloc.h>

六.与new的区别:
new 返回指定类型的指针,并且可以自动计算所需

int *p;p = new int;//返回类型为int *类型(整数型指针),分配大小为sizeof(int);
int *parr;parr = new int[100];//返回类型为int *类型(整数型指针),分配大小为sizeof(int) * 100;
  malloc 则必须要由我们计算字节数,并且在返回后强行转换为实际类型的指针
int *p;p = (int*)malloc(sizeof(int) * 128);//分配128个(可根据实际需要替换该数值)整型存储单元,//并将这128个连续的整型存储单元的首地址存储到指针变量p中double *pd = (double*)malloc(sizeof(double) * 12);//分配12个double型存储单元,//并将首地址存储到指针变量pd中

改变命令行程序的前景背景色:

Windows

cmd
键入enter后
键入enter后的提示信息

#include<stdio.h>#include<stdlib.h>#include<windows.h>void main(){    char str[10];    for(int i=0;i<16;i++){        sprintf(str,"color %x%x",i,15-i);        system(str);anshu        Sleep(2000);    }    getchar();}

Linux
参考以下两篇文章
http://blog.sina.com.cn/s/blog_8043547601013rxf.html
https://www.centos.bz/2013/07/linux-shell-c-show-color-word/
导出dll文件使用dll控制其他的程序
(1)vs中打开工程属性
(2)设置运行生成的类型
(3)参考代码可如下(test.c)

#include<Windows.h>_declspec(dllexport) void go(){    MessageBoxA(0,"HI","Title",MB_OK);}

(4)运行,获取生成的dll路径
弹出警示框正常现象
复制生成路径
(5)打开示例软件
(6)刷新可见新开的软件(新打开的软件在最底下)
刷新可见
(7)注入
注入vs中生成的dll文件
(8)将获得的路径输入,并输入要执行的函数
确定之后就会执行函数

操作窗体

//一个项目中必须有且只有一个main()
(1)拖动箭头点击QQ窗体
获取QQ窗体信息
(2)获取红框中的数据
获取需要的信息
(3)代码如下:

#include<windows.h>#include<stdio.h>void openQQ(){    ShellExecuteA(0, "open", "\"D:\\QQ\\Bin\\QQScLauncher.exe\"", 0, 0, 1);//非无意义值的参数依次为“open”字符串,打开路径,打开是否显示//或者ShellExecuteA(0, "open", "D:\\QQ\\Bin\\QQScLauncher.exe", 0, 0, 1);}void moveQQ(){    HWND win = FindWindowA("TXGuiFoundation","QQ");//HWND是 qq的编号; find寻找窗口    if (win == NULL)//-------------每获取一个对象,都要判断是否为空---------------    {        printf("获取窗口对象失败!");    }    int i = 0;    while (i < 768){        SetWindowPos(win, NULL, i*16/9, i, 500, 400, 0);//非无意义值的参数依次为: 窗口对象, x坐标,y坐标,宽度,高度        i += 10;//每次增加10像素        Sleep(100);        if (i/10%2)        {            ShowWindow(win, SW_HIDE);        }        else        {            ShowWindow(win, SW_SHOW);        }    }}void main(){    //system("taskkill /f /im qq.exe");    openQQ();    Sleep(5000);    moveQQ();    Sleep(5000);}

换桌面

SystemParametersInfoA(20,1,"C:\\Users\ASUS-PC\Pictures\\123.png",1);//SystemParametersInfo(20, True, 图片路径, 1)
1 1
原创粉丝点击