《C标准库》学习笔记

#include <iostream> #include <stdio.h> #include <iterator> using namespace std; int main() { FILE *file = tmpfile();//创建一个临时文件,以“wb+”方式打开 int a[2] = {5, 3}; fwrite((char*)a, sizeof(a), 1,file); fflush(file); char name[L_tmpnam]; char *p = tmpnam(name);//生成一个字符串,这个字符串是一个有效的文件名,并且他不和现有的文件名相同 printf("%s/n", name); printf("%s/n", p); cout<<endl; setbuf(stdout, NULL);//把缓冲区与流相联禁止缓冲,这样就会一个字符一个字符地输出 printf("wangyang/n"); cin.get(); }

11月20日

1、#undef宏的意思 #undef仅是取消前面的宏定义,为了不影响其他模块 预处理指令是在编译的过程中处理的,不是运行中处理的,因此放在return之后也没有问题,预处理的时候一样会处理那个#undef。 http://baike.baidu.com/view/1998342.htm 2、assert的详解 http://wzw19191.blog.163.com/blog/static/1311354702009926105524452/ http://topic.csdn.net/t/20030919/12/2278368.html 3、在stl的algorithm有函数max、min。同时还有min_element、max_element函数 4、宏的作用域都是全局(scope-less evil)的 http://blog.csdn.net/RNAMatrix/archive/2010/07/26/5765462.aspx

#include "stdafx.h" #include <iostream> using namespace std; int squre(int x) { printf("函数/n"); return (x*x); } #define PRINT(x) printf("%d/n", x) #define squre(x) ((x)*(x)) int _tmain(int argc, _TCHAR* argv[]) { int a = 4; cout<<squre(a)<<endl; //调用的是宏squre而非函数squre,因为宏是在squre预编译时候进行的,所以函数squre被编译器直接忽视了 PRINT(5); return 0; }

C语言中getenv函数的用法 getenv()读取环境变量的当前值的函数 原形:char *getenv(const char *name) 用法:s=getenv("环境变量名");    需先定义char *s; 功能:返回一给定的环境变量值,环境变量名可大写或小写。如果指定的变量在环境中未定义,则返回一空串。 头文件:stdlib.h eg: String strEnv =""; strEnv = getenv( "TMP_DIR"); if( ( NULL == strEnv ) || ( 0 == strlen(strEnv ) ) ) { //error }   getenv(取得环境变量内容) 相关函数 putenv,setenv,unsetenv 表头文件 #include<stdlib.h> 定义函数 char * getenv(const char *name); 函数说明 getenv()用来取得参数name环境变量的内容。参数name为环境变量的名称,如果该变量存在则会返回指向该内容的指针。环境变量的格式为name=value。 返回值 执行成功则返回指向该内容的指针,找不到符合的环境变量名称则返回NULL。 范例 #include<stdlib.h> mian() { char *p; if((p = getenv(“USER”))) printf(“USER=%s/n”,p); } 执行 USER = root   putenv(改变或增加环境变量) 相关函数 getenv,setenv,unsetenv 表头文件 #include4<stdlib.h> 定义函数 int putenv(const char * string); 函数说明 putenv()用来改变或增加环境变量的内容。参数string的格式为name=value,如果该环境变量原先存在,则变量内容会依参数string改变,否则此参数内容会成为新的环境变量。 返回值 执行成功则返回0,有错误发生则返回-1。 错误代码 ENOMEM 内存不足,无法配置新的环境变量空间。 范例 #include<stdlib.h> main() { char *p; if((p = getenv(“USER”))) printf(“USER =%s/n”,p); putenv(“USER=test”); printf(“USER+5s/n”,getenv(“USER”)); } 执行 USER=root USER=root   setenv(改变或增加环境变量) 相关函数 getenv,putenv,unsetenv 表头文件 #include<stdlib.h> 定义函数 int setenv(const char *name,const char * value,int overwrite); 函数说明 setenv()用来改变或增加环境变量的内容。参数name为环境变量名称字符串。 参数 value则为变量内容,参数overwrite用来决定是否要改变已存在的环境变量。如果overwrite不为0,而该环境变量原已有内容,则原内容会被改为参数value所指的变量内容。如果overwrite为0,且该环境变量已有内容,则参数value会被忽略。 返回值 执行成功则返回0,有错误发生时返回-1。 错误代码 ENOMEM 内存不足,无法配置新的环境变量空间 范例 #include<stdlib.h> main() { char * p; if((p=getenv(“USER”))) printf(“USER =%s/n”,p); setenv(“USER”,”test”,1); printf(“USER=%s/n”,getenv(“USEr”)); unsetenv(“USER”); printf(“USER=%s/n”,getenv(“USER”)); } 执行 USER = root USER = test USER = (null)

int _tmain(int argc, _TCHAR* argv[]) { char *name = getenv("path"); if (NULL == name) { cout<<"read fail!"<<endl; } else { cout<<name<<endl; } return 0; }

打开断言: #undef NDEBUG #include <assert.h> 关闭断言: #define NDEBUG #include <assert.h> 库<ctype.h>中是一些处理字符的函数 库<float.h>是存放一些浮点数的函数 库<limits.h>是存放一些整数值类型大小的库 库<local.h>是用来更改日期、货币等格式的库

#include "stdafx.h" #include <iostream> #include <string> #include <iterator> #include <memory> using namespace std; int main(int argc, char *argv[]) { int *pArr = new int[10]();//数组后面括号,对数组元素做值初始化 #include "stdafx.h" #include <iostream> #include <string> #include <iterator> #include <memory> using namespace std; int main(int argc, char *argv[]) { int *pArr = new int[10]();//数组后面括号,对数组元素做值初始化 copy(pArr, pArr+10, ostream_iterator<int>(cout, " ")); cout<<endl; //const对象的动态数组(每一个数组对象都是const,无法赋值,唯一的做法是对数组进行值初始化) const int *cpArr = new const int[10]; for (int i=0; i<10; i++) { // cpArr[i] = i; //该句错误,因为cpArr的元素类型为const,不能赋值 } const int *cpArr1 = new const int[10]();//等价于上面,对数组元素初始化 const string *cpStr = new const string[10];//调用string的默认构造函数 //允许动态分配空数组 int *pZeroArr = new int[0]; //返有效的非零指针,该指针与new返回的其它指针不同,不能进行解引用操作,因为它没有指向任何元素,但是可以进行比较、加减操作 cout<<typeid(pZeroArr).name()<<endl; if (NULL == pZeroArr) { cout<<"空指针!"<<endl; } else { cout<<"非空指针!"<<endl; } } 11月18日 #include "stdafx.h" #include <iostream> #include <string> #include <iterator> #include <memory> using namespace std; /*C语言中strcat函数的实现*/ char *catCstyleStr(char *des, const char * add) { char *pTemp = des; while (*pTemp != '/0') pTemp++; /* while (*pTemp != '/0') pTemp++; 将这两句简化成while(*pTemp++ != '/0');就不对,不知道为什么? */ while ((*pTemp++ = *add++) != '/0') ; return des; } int main() { char str[80]; strcpy(str, "wang"); catCstyleStr(str, "yang"); cout<<str<<endl; int a = 6; double b = 3.4; double c = a % b; //rror C2297: '%' : illegal, right operand has type 'double',%操作符的操作数只能是整形。包括bool,char, short,int,long以及对应的unsigned类型。 return 0; } //判断一个数是否为偶数的宏 #define isOshu(N) (((N) & (0x1)) == 0 ? 1 : 0) int main() { for (int i=0; i<10; i++) { if (isOshu(i)) { cout<<i<<endl; } } int a = 3; a += a + 7; //计算顺序,不清楚?看书后发现+=的优先级比+优先级低,所以先计算a+7,然后在计算+=。 cout<<a<<endl; return 0; } #include <iostream> #include <string> #include <iterator> #include <memory> using namespace std; /*统计输入的字符串中,连续出现最先的最多的字符串,及次数,参见C++Primeer第207页习题6.12*/ int main() { string str1; string str2; int maxCount = 0; int count = 0; string maxStr; cin>>str1; while (cin>>str2) { if (str1 == str2) { count++; } else { if (count >= maxCount) { maxStr = str1; maxCount = count; count = 0; } } str1 = str2; } cout<<maxStr<<" : "<<maxCount+1<<endl; } 库<float.h>描述了浮点数表示的属性 库<limits.h>描述了整数表示的属性 库<stdarg.h>描述了遍历可变参数表时需要的宏 库<stddef.h>中 类型ptrdiff_t是两个指针相减的结果的有符号整数类型。 类型size_t是sizeof操作符的结果的无符号整数类型。 类型wchar_t是一个整值类型。 宏NULL展开为实现定义的空指针常量。NULL一般的实现是(void *)0。 宏offset,用来确定一个结构体成员和这个结构体的起始位置的偏移量(以字节表示)。 typedef struct { char a; int b; double c; }student; int main() { cout<<offsetof(student, a)<<endl; cout<<offsetof(student, b)<<endl; cout<<offsetof(student, c)<<endl; cin.get(); } 一个表达式中既有有符号数也有无符号数,则在C/C++中会将有符号数转化为无符号数来进行运算。 exit和abort都是用来终止程序的函数,他们的不同如下: exit会做一些释放工作:释放所有的静态的全局的对象,缓存,关掉所有的I/O通道,然后终止程序。如果有函数通过atexit来注册,还会调用注册的函数。不过,如果atexit函数扔出异常的话,就会直接调用terminate。 abort:立刻terminate程序,没有任何清理工作。 http://blog.csdn.net/tangboyun/archive/2010/02/04/5288799.aspx freopen()重新打开一个文件,并将它与特定的流关联起来 tmpnam()创建一个文件名,不合现有的文件名重复 tmpfile()创建一个临时的二进制文件。默认的打开方式是"wb+". setbuf() http://abao.cn/?post=54 http://topic.csdn.net/u/20081028/18/9e41afd1-344e-4740-9abb-0402b94f2ef4.html linux中fifo http://blog.chinaunix.net/u2/88572/showart_1815264.html

 

 

 

STL之二分查找 (Binary search in STL http://blog.csdn.net/applelppa/archive/2007/11/21/1897134.aspx 库<stdlib.h>中包含 (1)、整形数学(int、div)等 (2)、算法bsearch()、qsort()、rand()、srand()等 (3)、文本转换(atoi、atof、atol、strtod、strtol、strtoul)等 (4)、多字节转换(mblen、mbstowcs)等——多字节和宽字节字符编码之间的转换 (5)、存储分配(alloc、realloc、malloc、free)calloc会对分配的空间进行初始化,且初始化为一个零字符串的数组 int *p = static_cast<int*>(calloc(10, sizeof(int))); //会进行初始化 for (int i=0; i<10; i++) { printf("%d/n", *(p+i)); } (6)、环境借口(abort、atexit、exit、getenv、system)等

你可能感兴趣的:(Algorithm,c,String,user,File,null)