寂井浮廊
打赏我
欢迎您: 
游客
   
登录
  发现BUG请联系jintianhu2000@126.com
常用
加解密算法
常用工具
EMV相关
还珠楼论坛
答题闯关
用户信息
帖子列表
语法介绍
帖子详情
C语言小笔记
jin.th 发布于2018-12-21 09:32
[评论区]
[我要回复]
[下载md文件]
[下载pdf文件]
仅自己可见
[TOC] # 使用socket 除了引入头文件外,还需要加入库文件WS2_32.lib 一种方法是在代码中写#pragma comment(lib,"WS2_32.lib"); 另一种方法是在项目中配置: ### VC6配置 ![image](/upload/BBS/54e9e4a9-7a1e-4a72-a911-2ba571a6608c.jpg) ### VS配置 ![image](/upload/BBS/4ca47add-80c9-4e9e-830e-02c1aa504cd8.jpg) ## 注意点 在使用任何winsock函数之前,必须先启动SOCKET库.比如调用gethostname()之前,必须调用WSAStartup()。 ```c #include
#include
``` 如果include顺序反过来,编译会报很多莫名其妙的错误。 # 使用timeGetTime() 需要加入库文件winmm.lib,参见上面 # itoa/atoi ```c
char *itoa(int value, char *string, int radix); 把一整数转换为字符串。 int atoi(const char *nptr); 把字符串转换成整型数 ``` # access ```c #include
WINDOWS下是
int access(const char *pathname,int mode) 判断用户是否具有访问某个文件的权限(或判断某个文件是否存在。 pathname:表示要测试的文件的路径 mode:表示测试的模式可能的值有: R_OK:是否具有读权限 W_OK:是否具有可写权限 X_OK:是否具有可执行权限 F_OK:文件是否存在 返回值:若测试成功则返回0,否则返回-1 ``` # strncpy ```c
char* strncpy(char *dest, char *src, size_t n); 将字符串src中最多n个字符复制到字符数组dest中(它并不像strcpy一样遇到NULL才停止复制,而是等凑够n个字符才开始复制),返回指向dest的指针。 ``` # remove ```c
int remove(char *filename); 删除一个文件 ``` # msgget ```c int msgget(key_t key, int msgflg); ``` 获取与某个键关联的消息队列标识 key:消息队列关联的键。 msgflg:消息队列的建立标志和存取权限。 IPC_CREAT如果内核中没有此队列,则创建它。 IPC_EXCL当和IPC_CREAT一起使用时,如果队列已经存在,则失败。 比如 msgget(10000,IPC_CREAT|0666) 其中0666表示存取权限,第一位0表示它是个八进制数据。第二位表示当前用户的权限:6=110(二进制),每一位分别对就 可读,可写,可执行,,6说明当前用户可读可写不可执行。第三位表示同组用户的权限,6的意义同上。第四位表示其它用户的权限,6的意义同上。 # sizeof与strlen的区别 ```c char str1[]= "\x6F\x24\x84\x0E\x11"; char str2[]="123"; printf("%d %d\n",sizeof(str1),sizeof(str2));//6 4 printf("%d %d\n",strlen(str1),strlen(str2));//5 3 char str1[]= "\x6F\x24\x84\x00\x11"; char str2[]="123"; printf("%d %d\n",sizeof(str1),sizeof(str2));//6 4 printf("%d %d\n",strlen(str1),strlen(str2));//3 3 ``` # 三字母词 ![image](/upload/BBS/f2a433c4-9893-4ea7-88fa-748719d70968.jpg) # DLL调用 C写的DLL,在自己电脑上C#去调是成功的,但在其他电脑上用C#去调用,可能会报找不到该DLL加载失败的错误。原因是该DLL有其它依赖项,在项目-属性-常规中将“MFC的使用”改为“在静态库中使用MFC”,就不会依赖其他DLL,这样在其他电脑上也能用了。 ![image](/upload/BBS/ef330819-a7cf-4426-af9c-4c9d53532593.jpg) ------------ 在32位PC上,C写的DLL,用C#去调用时可以的;但是若放到64 位PC上运行就会报“试图加载格式不正确的程序。 (异常来自 HRESULT:0x8007000B)”异常,解决方法是:右键C#项目点击属性。在属性窗口里选择“生成”——“目标平台”下拉里选中“X86"即可。 ------------ 为了保证头文件能被C与C++都调用,头文件里要这么声明: ```c #ifdef __cplusplus extern "C" { #endif //Void Foo(); //函数声明 #ifdef __cplusplus } #endif ``` # 编译问题 如果编译时出现如下警告: 警告: 隐式声明与内建函数 ‘malloc’ 不兼容 警告: 隐式声明与内建函数 ‘exit’ 不兼容 解决方法: 加上头文件 ```c #include
#include
``` ------------ 编译时加上-Wall可以使GCC产生尽可能多的警告信息,比如 gcc -Wall -o hello hello.c # _MSC_VER _MSC_VER是微软C/C++编译器——cl.exe编译代码时预定义的一个宏。 _MSC_VER的值表示cl的版本。 _MSC_VER的类型是"int" ```c MS VC++ 10.0 _MSC_VER = 1600 MS VC++ 9.0 _MSC_VER = 1500 MS VC++ 8.0 _MSC_VER = 1400 MS VC++ 7.1 _MSC_VER = 1310 MS VC++ 7.0 _MSC_VER = 1300 MS VC++ 6.0 _MSC_VER = 1200 MS VC++ 5.0 _MSC_VER = 1100 ``` # IAR IAR下数据类型占用的字节数 ![image](/upload/BBS/b6755433-3d8c-463b-a7f8-a13cacf1de9b.jpg) ![image](/upload/BBS/db858d91-20db-4027-b8ac-0835bfab6eef.jpg) ------------ IAR下char 默认是不带符号了,要使用带符号的变量就得使用signed char 。比如如下代码: ```c int Foo(char* s) { if(s[0]>=0) { return 0; } else { return 1; } } int main(void) { Foo("\x01\x02"); return 0; } ``` 就会在if(s[0]>=0)这行报pointless comparison of unsigned integer with zero的警告。改成 ```c int Foo(signed char* s) ``` 就可以消除该警告。 # 其它 使用SendMessage得加载user32.lib VC6 ALT+F8格式化代码 在C与C#中,由于<<的优先级低于+,因此`(1<<8)+2=258`,`1<<8+2`等价于`1<<(8+2)=1024`。 VS2008中不能命中断点时,更改如下设置: (1)项目-〉属性-〉配置属性-〉C/C++-〉常规-〉调试信息格式,这里不能为“禁用”。 (2)项目-〉属性-〉配置属性-〉链接器-〉调试-〉生成调试信息,这里设为“是”。 VS中调用LoadLibrary("user32.dll");始终返回NULL,用LoadLibrary(TEXT("user32.dll"));就可以,是因为LoadLibrary实际使用了LoadLibraryW而非LoadLibraryA,因此需要UNICODE字符串(宽字符串),而非窄字符串。可以将项目的字符集设置为“使用多字节字符集”,或者直接使用LoadLibraryA("user32.dll") # 编译时出现类似XXX may be unsafe 用VS2017编译控制台程序时,出现如下错误: ` 'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.` 解决方法时打开项目的属性页面 ![image](/upload/BBS/9f4a013f-323f-4d59-b288-fef791f4b4d6.jpg) 在预处理定义中加上`_CRT_SECURE_NO_WARNINGS`即可 # include CON Windows下`#include
`,Linux下`#include`,效果一样,都是使得OJ后台的编译器从标准输入中读取源代码,而不是从源文件中读取。它们会使编译器一直卡住直到有内容输入为止。 # BSTR BSTR是一种和VB兼容的字符串,它的特点是不再依靠'\0'来作为字符串结束的标记,而是在内容之前加了4个字节作为长度标志。BSTR本身是一个指向字符内容首部的指针,而长信息是在这个指针之前的4个字节,其值等于字符串内容长度,注意BSTR本身保存的是UNICODE编码的字符串,所以对于英文来说,它的长度是实际字母个数的2倍。因为这种特殊的存储结构,BSTR不能直接用C语言的malloc、free来分配、释放内存(当然配以后手工移动指针的位置也是可以的)。 根据这种原理,不难写出一个取得BSTR内容长度的语句: ```C++ BSTR bstr = ::SysAllocString(L"test string"); int length = *(int*)& ((char*)bstr)[-4]; int length2 = *(int*)(((int)bstr)-4); ``` 两种方法原理相同,都是直接取得首地址之前的4个字节的内容。此时length和length2的值都是BSTR中内容所占的字节数。 # pragma once 在头文件的最开始加入`#pragma once`就能够保证头文件被编译一次 详见[这里](https://baike.baidu.com/item/%23pragma%20once) # RGB888与RGB565互转 ```C //将2字节的RGB565格式(5 bit R+6 bit G+5 bit B)的颜色值转化为3字节的RGB888格式(1字节R+1字节G+1字节B)的颜色值 unsigned int RGB565toRGB888(unsigned short color) { int R = (color / 2048) / 31 * 255; int G = ((color / 32) %64) / 63 * 255; int B = (color % 32) / 31 * 255; return (R<<16) + (G<<8) + B; } //将3字节的RGB888格式(1字节R+1字节G+1字节B)的颜色值转化为2字节的RGB565格式(5 bit R+6 bit G+5 bit B)的颜色值 unsigned short RGB888toRGB565(unsigned int color) { int R = (color % 256) / 255 * 31; int G = ((color / 256) % 256) / 255 * 63; int B = (color / 65536) / 255 * 31; int rgb=R+G * 32 + B * 2048; if(rgb>=32768) { rgb-=65536; } return rgb; } ```
评论列表
回帖
浙ICP备17051204号