c++学习总结(一些零碎的小知识点)
来源:互联网 发布:户外主播用的什么网络 编辑:程序博客网 时间:2024/05/17 06:28
1.C语言中.和->区别
结构体变量用 .运算符来访问结构体的成员
指向结构体的指针用->来访问其指向的结构体的成员:->指向指针变量的运算符;
举例:p->m表示指针p指向结构体变量中的成员m;p->m等价于(*p).m
2.大BOOL和小bool之间的区别
BOOL为int型 bool为布尔型
长度不同 bool只有一个字节 BOOL长度视实际环境来定,一般可认为是4个字节
取值不同bool取值false和true,是0和1的区别 ,BOOL取值FALSE和TRUE,是0和非0的区别
3.单引号和双引号的区别:
双引号是用来表示字符串
"m"在内存中是 "m,\0"
单引号是用来表示单个字符的
'n'就是n //1个字节
4.VC中TRACE()的用法
1.在MFC中加入TRACE语句
2.在TOOLS->MFC TRACER中选择 “ENABLE TRACING”点击OK
3.进行调试运行,GO(F5)(特别注意:不是执行‘!’以前之所以不能看到TRACE内容,是因为不是调试执行,而是‘!’了,切记,切记)
4.然后就会在OUTPUT中的DEBUG窗口中看到TRACE内容了,调试执行会自动从BUILD窗口跳到DEBUG窗口,在那里就看到TRACE的内容了
5.BYTE类型
BYTE类型,其实就是无符号字符型。
你可以把它用在所有需要用无符号字符型的任何地方。
比较多的是在做文件读入读出的时候用指针的方式使用到。
比如说,下面这个有人说取代冒泡和选择排序的要进入教材很火的鸽巢排序,里面就用到BYTE类型
2
3
4
5
6
7
8
9
void
PigeonholeSort(
BYTE
*array,
int
length){
int
b[256] = {0};
int
i,k,j = 0;
for
(i=0; i<length; i++)
b[array[i]]++;
for
(i=0; i<256; i++)
for
(k=0; k<b[i]; k++)
array[j++] = i;
6.fopen(打开文件) 相关函数 open,fclose 表头文件 #include<stdio.h> 定义函数 FILE * fopen(const char * path,const char * mode); 函数说明参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。mode有下列几种形态字符串:r 打开只读文件,该文件必须存在。r+ 打开可读写的文件,该文件必须存在。w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。上述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b 字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。返回值文件顺利打开后,指向该流的文件指针就会被返回。若果文件打开失败则返回NULL,并把错误代码存在errno 中。 附加说明一般而言,开文件后会作一些文件读取或写入的动作,若开文件失败,接下来的读写动作也无法顺利进行,所以在fopen()后请作错误判断及处理。
7.cstring 转char*
CString strTemp;
char
szTemp[128];
strTemp = _T("abckdkfei");
memset( szTemp, 0, sizeof(szTemp) );
strcpy( szTemp, strTemp.GetBuffer(strTemp.GetLength()) );
8.string转 CString
CString.format("%s", string.c_str());
char 转 CString
CString.format("%s", char*);
char 转 string
string s(char *);
string 转 char *
char *p = string.c_str();
CString 转 string
string s(CString.GetBuffer());
9.文件的操作
FILE *fopen(char *filename,char *type) 打开一个文件filename,打开方式为type,
并返回这个文件指针,type可为以下字符串加上后缀
┌──┬────┬───────┬────────┐
│type│读写性 │文本/2进制文件│建新/打开旧文件 │
├──┼────┼───────┼────────┤
│r │读 │文本 │打开旧的文件 │
│w │写 │文本 │建新文件 │
│a │添加 │文本 │有就打开无则建新│
│r+ │读/写 │不限制 │打开 │
│w+ │读/写 │不限制 │建新文件 │
│a+ │读/添加 │不限制 │有就打开无则建新│
└──┴────┴───────┴────────┘
可加的后缀为t、b。加b表示文件以二进制形式进行操作,t没必要使用
10, 将一个大的字符串写入到文件中、
Char *Section_One[]={ //char*[]是一个二维数组
"# 'setjmp.h'",
"# 'math.h'",
"# 'signal.h'",
"# 'stdarg.h'",
"# 'stddef.h'",
"# 'stdio.h'",
"# 'stdlib.h'",
"# 'string.h'",
"# 'time.h'",
" -1", }
for(temp_one=0; temp_one < sizeof(Section_One)/sizeof(char*);temp_one++){
fwrite(Section_One[temp_one],strlen(Section_One[temp_one]),1,fp);
fputc('\n',fp);
};
11.
编程中经常能遇到LNK2005错误——重复定义错误,其实LNK2005错误并不是一个很难解决的错误。弄清楚它形成的原因,就可以轻松解决它了。造成LNK2005错误主要有以下几种情况: 1.重复定义全局变量。可能存在两种情况: A、对于一些初学编程的程序员,有时候会以为需要使用全局变量的地方就可以使用定义申明一下。其实这是错误的,全局变量是针对整个工程的。正确的应该是在一个CPP文件中定义如下:int g_Test;那么在使用的CPP文件中就应该使用:extern int g_Test即可,如果还是使用int g_Test,那么就会产生LNK2005错误,一般错误错误信息类似:AAA.obj error LNK2005 int book c?book@@3HA already defined in BBB.obj。切记的就是不能给变量赋值否则还是会有LNK2005错误。 这里需要的是“声明”,不是“定义”!根据C++标准的规定,一个变量是声明,必须同时满足两个条件,否则就是定义: (1)声明必须使用extern关键字;(2)不能给变量赋初值 所以,下面的是声明: extern int a; 下面的是定义 int a; int a = 0; extern int a =0; B、对于那么编程不是那么严谨的程序员,总是在需要使用变量的文件中随意定义一个全局变量,并且对于变量名也不予考虑,这也往往容易造成变量名重复,而造成LNK2005错误。2.头文件的包含重复。往往需要包含的头文件中含有变量、函数、类的定义,在其它使用的地方又不得不多次包含之,如果头文件中没有相关的宏等防止重复链接的措施,那么就会产生LNK2005错误。解决办法是在需要包含的头文件中做类似的处理:#ifndef MY_H_FILE //如果没有定义这个宏 #define MY_H_FILE //定义这个宏 ……. //头文件主体内容 ……. #endif 上面是使用宏来做的,也可以使用预编译来做,在头文件中加入: #pragma once //头文件主体 3.使用第三方的库造成的。这种情况主要是C运行期函数库和MFC的库冲突造成的。具体的办法就是将那个提示出错的库放到另外一个库的前面。另外选择不同的C函数库,可能会引起这个错误。微软和C有两种C运行期函数库,一种是普通的函数库:LIBC.LIB,不支持多线程。另外一种是支持多线程的:msvcrt.lib。如果一个工程里,这两种函数库混合使用,可能会引起这个错误,一般情况下它需要MFC的库先于C运行期函数库被链接,因此建议使用支持多线程的msvcrt.lib。所以在使用第三方的库之前首先要知道它链接的是什么库,否则就可能造成LNK2005错误。如果不得不使用第三方的库,可以尝试按下面所说的方法修改,但不能保证一定能解决问题,前两种方法是微软提供的: A、选择VC菜单Project->Settings->Link->Catagory选择Input,再在Ignore libraries 的Edit栏中填入你需要忽略的库,如:Nafxcwd.lib;Libcmtd.lib。然后在Object/library Modules的Edit栏中填入正确的库的顺序,这里需要你能确定什么是正确的顺序,呵呵,God bless you! B、选择VC菜单Project->Settings->Link页,然后在Project Options的Edit栏中输入/verbose:lib,这样就可以在编译链接程序过程中在输出窗口看到链接的顺序了。 C、选择VC菜单Project->Settings->C/C++页,Catagory选择Code Generation后再在User Runtime libraray中选择MultiThread DLL等其他库,逐一尝试。 关于编译器的相关处理过程,参考: http://www.donews.net/xzwenlan/archive/2004/12/23/211668.aspx这就是我所遇到过的LNK2005错误的几种情况,肯定还有其他的情况也可能造成这种错误,所以我不希望你在看完这篇文章以后再遇到LNK2005错误时候,不动脑筋的想对号入座的排除错误。编程的过程就是一个思考的过程,所以还是多多开动你的头脑,那样收获会更多! 实用的解决方案:从某人的博客找到的:解决方案一:把主函数所包含的操作函数.cpp,改为头文件.h,然后就可以解决如上错误。解决方案二:重新打开编译器,重新打开刚才的文件,先打开主函数.cpp,然后编译运行,打开Fileview,其中有一个external dependencies,把头文件.h,和操作函数.cpp添加到这里,这样再编译运行主函数.cpp,程序运行成功!我遇到的错误:error LNK2005 ,用上面两种方法均有效解决。
12.格式化输出
#define FORMAT"%5d%5d%5d%5d%2c %-50s%10s\n"
默认是右对齐
5d是5个空格
-50s是50个字符左对齐
13.字符串连接
char *zdy = new char[9]; //分配内存空间
strcpy(zdy,"ZDY."); //字符串初始化
char str[10];
strcat(zdy,itoa(res->Number_LDRA,str,10));//将字符串放在zdy中
14.
%[^&]的意思是指输入的数据要遇上&才结束;比如说在处理字符串中的scanf("%s",a);如果普通的话遇上了空格或者回车就结束了;但把它改成这个样子scanf("%[^=]",a);就表示在输入数据中是以‘=’为结束标志的。在遇到空格和回车都不结束当前输入。这句话有意思的地方就在于当使用这种特殊结束标志以后,这个标志不但不会被存储在对应的存储空间里,而且输出的时候按照普通方法即可输出所输入的字符;比如我说,我输入了:sdfasf asdfasf adf asfadsffds =使用printf("%s",a);它就会按照原样式输出到’=‘前的位置;
15.判断char test[4]是否为空
If( Strlen(test) == 0)
- c++学习总结(一些零碎的小知识点)
- 记·一些零碎的小知识点
- angularJS最近总结一些零碎的知识点
- 今天零碎学习的小知识点
- 零碎的小知识点
- 一些零碎的知识点
- 一些零碎的知识点
- c 语言零碎知识点总结
- springmvc的一些零碎知识点
- 一些零碎的ios知识点 ~
- Tableau的一些零碎知识点
- js的一些零碎知识点
- 一些小的知识点(c++)
- 记录一些学习到的零碎的知识点。
- ARM零碎知识点总结(尽可能零碎)
- 总结的一些小知识点
- java学习中的一些零碎知识点(一)
- 初学者C++学习笔记 零碎小知识点
- Adb connection Error:远程主机强迫关闭了一个现有的连接
- 高效显示Bitmap1--->高效加载大图
- Axure 学习战略
- stm28335-pwm模块-及ccd的时序驱动模块的实现-编程问题——项目问题1
- libc++abi.dylib: terminate_handler unexpectedly threw an exception错误小结
- c++学习总结(一些零碎的小知识点)
- c++_primer_exercise_1331
- C#中的各种流
- 将form表单里的数据封装成对象 json2.js的例子 jquery的serialize方法转换空格为+号的解决方法
- http://blog.csdn.net/xufeng0991/article/details/36672535
- xshell中文乱码设置方法
- 【Java】利用文件输入输出流完成把一个文件夹内的所有文件拷贝的另一的文件夹的操作
- LKT4203 32位高性能RSA防盗版加密芯片
- 计算机视觉的专家和网站