c++学习总结(一些零碎的小知识点)

来源:互联网 发布:户外主播用的什么网络 编辑:程序博客网 时间:2024/05/17 06:28

1.C语言中.和->区别

结构体变量用 .运算符来访问结构体的成员

指向结构体的指针用->来访问其指向的结构体的成员:->指向指针变量的运算符;

举例:p->m表示指针p指向结构体变量中的成员mp->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(打开文件) 相关函数 openfclose 表头文件 #include<stdio.h> 定义函数 FILE * fopen(const char * path,const char * mode); 函数说明参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。mode有下列几种形态字符串:r 打开只读文件,该文件必须存在。r+ 打开可读写的文件,该文件必须存在。w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。上述的形态字符串都可以再加一个b字符,如rbw+bab+等组合,加入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 cbook@@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 ModulesEdit栏中填入正确的库的顺序,这里需要你能确定什么是正确的顺序,呵呵,God bless you B、选择VC菜单Project->Settings->Link页,然后在Project OptionsEdit栏中输入/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"

默认是右对齐

5d5个空格

-50s50个字符左对齐

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)

 

 

 

 

0 0
原创粉丝点击