C++函数学习(四)

90  RTrim的用法,代码用来处理字符的前后空格

返回一个字符串并截断后所有空格。

用 RTrim,这个我原来只知道用来删除最后的空格,也没有仔细看过其它的用法,才发现可以直接trim掉一些字符         

s = s.ToString().RTrim(',')

91  erase()函数的用法?

删除一个元素或者一个元素的范围在一个字符串从一个指定的位置。

标准C++库字符串类std::string的erase是删除字符串的

用法:

erase函数的原型如下:
(1)string& erase ( size_t pos = 0, size_t n = npos );
(2)iterator erase ( iterator position );
(3)iterator erase ( iterator first, iterator last );
也就是说有三种用法:
(1)erase(pos,n); 删除从pos开始的n个字符,比如erase(0,1)就是删除第一个字符
(2)erase(position);删除position处的一个字符(position是个string类型的迭代器)
(3)erase(first,last);删除从first到last之间的字符(first和last都是迭代器)
92  iterator

一个类型,它提供了一个随机访问迭代器,可以访问和阅读一个常量元素字符串。

93 begin()函数和end()函数

stl list 使用begin()函数和end()函数输出结果

//所有容器类别都提供一些成员函数,使得获得迭代器并以之遍访所有元素,这些函数如下:
//begin()返回一个迭代器,指向容器起始点,也就是第一元素的位置
//end()返回一个迭代器,指向容器结束点。结束点在最后一个元素之后

94  c++文件流基本用法(fstream, ifstream, ostream)

前言:
c++
的文件流处理其实很简单,前提是你能够理解它。文件流本质是利用了一个buffer中间层。有点类似标准输出和标准输入一样。

c++ IO的设计保证IO效率,同时又兼顾封装性和易用性。本文将会讲述c++文件流的用法。

有错误和疏漏的地方,欢迎批评指证。

需要包含的头文件:<fstream> 

名字空间: std

也可以试用<fstream.h>

fstream
提供了三个类,用来实现c++对文件的操作。(文件的创建,读写)。
  ifstream       --
从已有的文件读

  ofstream     -- 向文件写内容

  fstream       - 打开文件供读写

支持的文件类型

实际上,文件类型可以分为两种:文本文件和二进制文件.

文本文件保存的是可读的字符,而二进制文件保存的只是二进制数据。利用二进制模式,你可以操作图像等文件。用文本模式,你只能读写文本文件。否则会报错。

 

例一: 写文件

声明一个ostream变量

  1. 调用open方法,使其与一个文件关联
  2. 写文件
  3. 调用close方法.

1.       #include<fstream.h>

2.        

3.       void main

4.       {

5.          ofstream file;

6.        

7.          file.open("file.txt");                

8.        

9.          file<<"Hello file/n"<<75;                        

10.    

11.      file.close();                                                           

12.   }

可以像试用cout一样试用操作符<<向文件写内容.
Usages:

1.        

2.          file<<"string/n";

3.          file.put('c');

例二:  读文件

1. 声明一个ifstream变量.

2. 打开文件.

3. 从文件读数据

4. 关闭文件.

1.       #include<fstream.h>

2.        

3.       void main

4.       {

5.          ifstream file;

6.          char output[100];

7.          int x;

8.        

9.          file.open("file.txt");

10.    

11.      file>>output;                          

12.      cout<<output;                         

13.      file>>x;                                 

14.      cout<<x;                                

15.    

16.      file.close();                             

17.   }

同样的,你也可以像cin一样使用>>来操作文件。或者是调用成员函数

Usages:

1.        

2.          file>>char *;                          

3.          file>>char;                                            

4.          file.get(char);                         

5.          file.get(char *,int);   

6.          file.getline(char *,int sz);

7.          file.getline(char *,int sz,char eol);

1.同样的,你也可以使用构造函数开打开一个文件、你只要把文件名作为构造函数的

第一个参数就可以了。

1.          ofstream file("fl.txt");

2.          ifstream file("fl.txt");

上面所讲的ofstreamifstream只能进行读或是写,而fstream则同时提供读写的功能。
void main()

1.       {

2.          fstream file;

3.        

4.          file.open("file.ext",iso::in|ios::out)

5.        

6.          //do an input or output here

7.        

8.          file.close();

9.       }

open函数的参数定义了文件的打开模式。总共有如下模式

1.                                         属性列表

2.        

3.       ios::in                        

4.       ios::out                      

5.       ios::app                       从文件末尾开始写

6.       ios::binary       二进制模式

7.       ios::nocreate 打开一个文件时,如果文件不存在,不创建文件。

8.       ios::noreplace              打开一个文件时,如果文件不存在,创建该文件

9.       ios::trunc                     打开一个文件,然后清空内容

10.   ios::ate                        打开一个文件时,将位置移动到文件尾


Notes

  • 默认模式是文本
  • 默认如果文件不存在,那么创建一个新的
  • 多种模式可以混合,用|(按位或)
  • 文件的byte索引从0开始。(就像数组一样)

我们也可以调用read函数和write函数来读写文件。

 

文件指针位置在c++中的用法:

1.          ios::beg                    文件头

2.          ios::end                    文件尾

3.          ios::cur                    当前位置

例子:

1.          file.seekg(0,ios::end);                             

2.        

3.               int fl_sz = file.tellg();                  

4.         

5.          file.seekg(0,ios::beg);                             

常用的错误判断方法:

1.          good()                     如果文件打开成功

2.          bad()                       打开文件时发生错误

3.          eof()                                       到达文件尾

例子:

1.          char ch;

2.          ifstream file("kool.cpp",ios::in|ios::out);

3.        

4.          if(file.good()) cout<<"The filehas been opened without problems;

5.          else cout<<"An Error has happendon opening the file;             

6.        

7.          while(!file.eof())

8.          {

9.                          file>>ch;

10.                      cout<<ch;

11.      }

http://blog.csdn.net/bichenggui/article/details/4600153

95  close()函数的用法

释放所有相关的资源与该组件。

 close()函数 
 close()
函数的作用是关闭由open()函数打开的文件, 其调用格式为
  int close(int handle); 

  该函数关闭文件描述字handle相连的文件。

96  open()函数的用法

 open()函数的作用是打开文件, 其调用格式为
     int open(char*filename, int access); 

    该函数表示按access的要求打开名为filename的文件, 返回值为文件描述字
其中access有两部分内容: 基本模式和修饰符, 两者用""("")方式连接。修 
饰符可以有多个, 但基本模式只能有一个。access的规定如表3-2 
              
3-2 access的规定 
━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 
基本模式   含义   修饰符          
──────────────────────────── 

O_RDONLY    只读  O_APPEND   文件指针指向末尾 
O_WRONLY   
只写  O_CREAT    文件不存在时创建文件
                             
属性按基本模式属性 
O_RDWR     
读写  O_TRUNC    若文件存在, 将其长度 
                             
缩为0,属性不变 
                  O_BINARY  
打开一个二进制文件 
                  O_TEXT    
打开一个文字文件 
━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 
    open()
函数打开成功, 返回值就是文件描述字的值(非负值), 否则返回-1

97  C++getline函数用法

getline()   语法:       

 istream&getline(char *buffer, streamsize num );   

 istream&getline(char *buffer, streamsize num, char delim );   

getline()读取字符到buffer中,buffer在代码中通常体现为一个字符数组,streamsize num是一次读入多少个字符,   num- 1个字符已经读入,       当碰到一个换行标志,  碰到一个EOF  或者任意地读入,直到读到字符delimdelim字符不会被放入buffer中。delim字符可以自已设定,默认为回车符'/n' 

 

getline(cin,s,'d'); 

期中的getline(cin,s,'d');一句中的‘d’ 是控制在输出时,当遇到 ‘d’  时就停止,也就是只输出 d 以前的字符;但是也可以写成是getline(cin.s)在输出时就不受限制,输入是什么,输出就是什么。

empty

GetLine

简述

原型

  istream& getline ( istream &is , string &str , chardelim );

  istream& getline ( istream& , string& );

参数

  is 进行读入操作的输入流

  str 存储读入的内容

  delim 终结符

返回值

  与参数is是一样的

功能

  将输入流is中读到的字符存入str中,直到遇到终结符delim才结束。对于第一个函数delim是可以由用户自己定义的终结符;对于第二个函数delim默认为 '\n'(换行符)。

  函数在输入流is中遇到文件结束符(EOF)或者在读入字符的过程中遇到错误都会结束。

  在遇到终结符delim后,delim会被丢弃,不存入str中。在下次读入操作时,将在delim的下个字符开始读入。

  举例:

  int main()

  {

  string str;

  getline(cin,str,'#');

  char c=getchar();

  cout<<str<<' '<<c<<endl;

  return 0;

  }

  输入为:aa#b

  输出为:aa b

注意

  这个getline是个全局函数,而不是iostream的成员函数getline。

成员函数getline

  getline也可以作为成员函数使用

  cin.getline(char* cha,int num,char f);

  向cha中输入num个字符,输入过程中达到num个数或者提前遇到f字符,输入结束。

 

98  枚举类型enum用法

枚举常量是枚举类型中的值,即枚举值。枚举类型是一种用户定义的类型,只有用户在程序中定义它后才能被使用。用户通常利用枚举类型定义程序中需要使用的一组相关的符号常量。枚举类型的定义格式为:   
  enum   <枚举类型名>   {<枚举表>};

99  empty 函数

语法:boolempty();

如果当前vector没有容纳任何元素,则empty()函数返回true,否则返回false.例如,以下代码清空一个vector,并按照逆序显示所有的元素:

vector<int> v; for( int i = 0; i< 5; i++ ) { v.push_back(i); } while( !v.empty() ) { cout << v.back()<< endl; v.pop_back(); }

100 c++substr()字符函数的使用方法

str.substr(startpos,length);

其中 startpos 是起始字符的序号,length 是[从 startpos 开始]取的字符串长度(包startpos )。

如果要取得 str 中序号 m 到 n 之间(不包括n)的子字符串需要用str.substr(m,n-m);

stringa=s.substr(0,4);       //获得字符串s中从第0位开始的长度为4的字符串

101 find_first_of函数的用法

string s="abcdefghijkabcddacb";

int i=s.find_first_of('b',1);

int j=s.find_first_of('b',2);

请问i,j等于多少?

函数括号里的第二个参数到底是什么意思???

i=1,j=12

第二个参数是位置,从零开始算

那个参数表示从字符哪个位置开始查找,你要记住第一个位置是0

102  vector中的insert()如何使用?

iteratorinsert( iterator loc, const TYPE &val );
void insert( iterator loc, size_type num, constTYPE &val );
void insert( iterator loc, input_iterator start,input_iterator end );

insert() 函数有以下三种用法:  
在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器,  
在指定位置loc前插入num个值为val的元素  
在指定位置loc前插入区间[start,end)的所有元素. 

103  C++ string.find() 函数的用法总结

wstringstr(L"abcdefghijklmnopqrst");//假设要找fgh
str.find(L"fgh"); //函数返回6表示字串在6号位置

 说明:

1. 如果string sub = ”abc“;

             string s = ”cdeabcigld“;

     s.find(sub) ,s.rfind(sub) 这两个函数,如果完全匹配,才返回匹配的索引,即:当s中含有abc三个连续的字母时,才返回当前索引。

    s.find_first_of(sub),  s.find_first_not_of(sub),   s.find_last_of(sub), s.find_last_not_of(sub)  这四个函数,查找s中含有sub中任意字母的索引。

2. 如果没有查询到,则返回string::npos,这是一个很大的数,其值不需要知道。

104  使用stringstream对象简化类型转换

<sstream>库定义了三种类:istringstreamostringstreamstringstream,分别用来进行流的输入、输出和输入输出操作。另外,每个类都有一个对应的宽字符集版本。简单起见,我主要以stringstream为中心,因为每个转换都要涉及到输入和输出操作。列表A示例了怎样使用一个stringstream对象进行从intstring类型的转换。

注意,<sstream>使用string对象来代替字符数组。这样可以避免缓冲区溢出的危险。而且,传入参数和目标对象的类型被自动推导出来,即使使用了不正确的格式化符也没有危险。

stringint的转换

进行相反的从stringint类型的转换,只需将传递方向反过来。例如:

string result=”10000”;

int n=0;

stream<<result;

stream>>n;//n等于10000

重复利用stringstream对象

如果你打算在多次转换中使用同一个stringstream对象,记住再每次转换前要使用clear()方法,如列表B所示。

在多次转换中重复使用同一个stringstream(而不是每次都创建一个新的对象)对象最大的好处在于效率。stringstream对象的构造和析构函数通常是非常耗费CPU时间的。

在类型转换中使用模板

你可以轻松地定义函数模板来将一个任意的类型转换到特定的目标类型。例如,需要将各种数字值,如intlongdouble等等转换成字符串,要使用以一个string类型和一个任意值t为参数的to_string()函数。to_string()函数将t转换为字符串并写入result中。使用str()成员函数来获取流内部缓冲的一份拷贝:

template<classT>

voidto_string(string & result,const T& t)

{

ostringstreamoss;//创建一个流

oss<<t;//把值传递如流中

result=oss.str();//获取转换后的字符转并将其写入result

}

这样,可以轻松地将多种数值转换成字符串了:

to_string(s1,10.5);//doublestring

to_string(s2,123);//intstring

to_string(s3,true);//boolstring

可以更进一步定义一个通用的转换模板,用于任意类型之间的转换。函数模板convert()含有两个模板参数out_typein_value,功能是将in_value值转换成out_type类型:

template<classout_type,class in_value>

out_type convert(constin_value & t)

{

stringstream stream;

stream<<t;//向流中传值

out_type result;//这里存储转换结果

stream>>result;//result中写入值

return result;

}

这样使用convert():

double d;

string salary;

string s=”12.56”;

d=convert<double>(s);//d等于12.56

salary=convert<string>(9000.0);//salary等于”9000”

在过去留下来的程序代码和纯粹的C程序中,传统的<stdio.h>形式的转换伴随了我们很长的一段时间。但是,如文中所述,基于stringstream的转换拥有类型安全和不会溢出这样抢眼的特性,使我们有充足得理由抛弃<stdio.h>而使用<sstream><sstream>库还提供了另外一个特性可扩展性。你可以通过重载来支持自定义类型间的转换。我会在以后接下来的文章中对其进行讨论。

105 “类名()”是什么意思?

请问throw后面的 “类名()”是什么意思?
比如:throw   runtime_error("there   is   an   error! ") 
    书上throw表达式解释为:throw后跟一个异常类的对象,但是上面语句里throw后面的 "runtime_error( "there   is   an  error! ") "是个对象吗?! 
    就是对“类名()”的表达不明白 
 抛出一个runtime_error("there is an error! ")的异常
runtime_error( "there is an error! "): 用字符串 "there is an error! "构造一个runtime_error对象 ;

 

throw ExceptionClass(“oh, shit! it’s aexception!L “); 
例句中,ExceptionClass是一个类,它的构造函数以一个字符串做为参数,用来说明异常。也就是说,在throw的时候,C++的编译器先构造一个ExceptionClass的对象,让它作为throw的返回值,抛——出去。同时,程序返回,调用析构。 

表达式类名(参数)的意思是构造一个匿名的对象。 

方便而已。 

CComBSTR bstrCComBSTR( "cstring "); 
function(bstr);
 
等于 
function(CComBSTR( "c string "));

程序要兼容多字节的,也要兼容ASCII的;

106  #ifdef_CINIFILE_DEBUG

 std::cout <<"CIniFileA::GetSection()" << std::endl;

#endif

Trim(sSection);

如果 定义了_CINIFILE_DEBUG 则 执行  

std::cout << "CIniFileA::GetSection()" << std::endl;

没有定义,则不输出,有时是为了提醒、标识的作用;

107  c++ 里面类名后面跟一个&*是什么意思,有什么区别?

GetInstancemyInstanceclassA里定义的对象:

static classA& GetInstance();

static classA* myInstance;

之后引用,下面这两条语句是什么意思?&*分别代表什么意思?谢谢!

classA * classA::myInstance = NULL;  

classA& classA::GetInstance()

{}

表示指针

&表示取地址符

定义的class A这个类的对象mylnstance 的值是空

classAGetlinstace里面的地址

&是引用,*是指针,&的话就是直接对传进来的变量操作 *的话和&类似

108c++中的单冒号与双冒号

1.冒号(:)用法

1)表示机构内位域的定义(即该变量占几个bit空间)

typedef struct _XXX{

         unsigned char a:4;

         unsigned char c;

} ; XXX

(2)构造函数后面的冒号起分割作用,是类给成员变量赋值的方法,初始化列表,更适用于成员变量的常量const型。

struct _XXX{

         _XXX() : y(0xc0) {}

};

(3) public:private:后面的冒号,表示后面定义的所有成员都是公有或私有的,直到下一个"public:”"private:”出现为止。"private:"为默认处理。

(4)类名冒号后面的是用来定义类的继承。

class 派生类名 : 继承方式基类名

{

    派生类的成员

};

继承方式:public、private和protected,默认处理是public。

2.双冒号(::)用法

1)表示域操作符

例:声明了一个类A,类A里声明了一个成员函数void f(),但没有在类的声明里给出f的定义,那么在类外定义f时,

就要写成void A::f(),表示这个f()函数是类A的成员函数。

2)直接用在全局函数前,表示是全局函数

例:在VC里,你可以在调用API 函数里,在API函数名前加::

3)表示引用成员函数及变量,作用域成员运算符

例:System::Math::Sqrt() 相当于System.Math.Sqrt()

109[C++语法] 关键字typedef用法

C/C++语言中的typedef相信大家已经不陌生,本文对C/C++语言关键字typedef的各种用法作一个介绍。

typedef,顾名思义,为“类型定义”,可以解释为:将一种数据类型定义为某一个标识符,在程序中使用该标识符来实现相应数据类型变量的定义。例如:

 

typedef unsigned int UINT;

int main (int argc, char *argv[])

{

    unsigned int a;   //it’s OK

    UINTb; // it’s OK, a and b are of the same type (int)

    //. . .    // code references the symbol a and b

    return 0;

}

 

上面的代码中,a和b属于同一种数据类型(unsigned int型),因为UINT标识符已经标示为unsigned int类型。上面的代码看似简单,相信很多读者都用过这种方法,但这绝不是typedef的全部,下面介绍使用typedef定义复杂数据类型的几种用法。

 

1 定义结构体类型

结构体是一种较为常见的数据类型,在C/C++程序设计中使用的非常广泛。下面的代码就是结构体类型的一个应用:

#include <iostream.h>

int main (int argc, char *argv[])

{

    struct {int x; int y;}point_a, point_b;

    point_a.x = 10; point_a.y = 10;

    point_b.x = 0; point_b.y = 0;

    ios::sync_with_stdio();

    cout<< point_a.x + point_a.y << endl;

    cout<< point_b.x + point_b.y << endl;

    return 0;

}

上面的代码包含了两个结构体变量:point_apoint_b,它们的数据类型相同,都是struct {int x; int y;}类型。这种说法可能有点别扭,习惯上说point_apoint_b都是结构体类型,为什么偏偏要说是struct {int x; int y;}类型呢?因为这种说法更加精确。比如在第一个例子中,对于“unsigned int a,b;”这条语句,我们可以说ab都是整数类型,但更精确地说,它们应该是unsigned int类型。

既然struct {int x;int y;}是一种自定义的复杂数据类型,那么如果我们要定义多个struct {int x;int y;}类型的变量,应该如何编写代码呢?其实很简单,就当struct {int x;int y;}是一个简单数据类型就可以了:

struct {int x; int y;} var_1;   // 定义了变量var_1

struct {int x; int y;} array_1 [10];    // 定义了数组array_1

struct {struct{int x; int y;} part1; int part2;} cplx;

上面的第三行定义了一个cplx变量,它的数据类型是一个复杂的结构体类型,有两个成员:part1part2part1struct {int x; int y;}类型的,part2int类型的。

从上面的例子可以看出,如果在程序中需要多处定义struct {int x;int y;}类型的变量,就必须多次输入“struct {int x;int y;}”这一类型名称,况且,如果在结构体中有某个成员是struct {int x;int y;}类型的,还会使得定义变得非常繁杂而且容易出错。为了输入程序的方便,同时为了增强程序的可读性,我们可以把struct {int x;int y;}这一数据类型定义为标识符“Point”,那么上面的程序就会变得更容易理解:

typedef struct {int x; int y;} Point;

Point var_1; // 定义了变量var_1

Point array_1 [10]; // 定义了数组array_1

struct {Point part1; int part2;} cplx; // 定义了复杂类型变量cplx

需要说明的是,我们还可以使用下面的方法来定义结构体变量:

struct t_Point {

    int x; int y;};    // 注意,这里最后一个分号不能省略

 

int main(int argc, char*argv[])

{

    struct t_Point a, b;

    // . . .

    return 0;

}

显然,这种方法没有typedef更加直观(在C++中,main函数第一行的struct关键字可以省略,但在标准C中,省略该关键字会出现编译错误)。

此外,对于定义链接队列中的结点,我们可以这样实现:

typedef struct t_node {

    int Value;

    struct t_node *next;

} Node;

当然也可以这样定义:

typedef strcut t_node Node;

struct t_node {

    int Value;

    Node *next;

};

 

2、定义数组类型

与定义结构体类型相似,可以使用typedef来定义数组类型,例如:

typedef int MyIntArray [100];

那么程序中的

MyIntArray ia;

就相当于

int ia[100];

3 定义函数指针

看下面的代码:

typedef void (*FUNCADDR)(int)

此处FUNCADDR是指向这样一个函数的指针,该函数的返回值为void类型,函数有一个int型的参数。再例如:

void print (int x)

{

    printf (“%d\n”, x);

}

int main (int argc, char *argv[])

{

    FUNCADDR pFunc;

    pFunc = print;  // 将指针指向print函数

    (*pFunc)(25);       // 调用函数print

    return 0;

}

函数指针一般用于回调函数、中断处理过程的声明,以及在面向对象程序设计中对事件处理过程的声明。

4 定义类类型

类是面向对象程序设计语言中引入的一种新的数据类型,既然是数据类型,就可以使用typedef对其进行定义:

typedef class {

    private:

        int a;

    public:

        int b;

} MyClass;

其实这和定义结构体类型非常相似,不过很少有人这么使用。

110 namespace用法

namespace既“命名空间”,也称“名称空间” VS.NET中的各种语言使用的一种代码组织的形式通过名称空间来分类,区别不同的代码功能同时也是VS.NET中所有类的完全名称的一部分

 如同名字一样的意思,NameSpace:名字空间,之所以出来这样一个东西,是因为人类可用的单词数太少,并且不同的人写的程序不可能所有的变量都没有重名现象,对于库来说,这个问题尤其严重,如果两个人写的库文件中出现同名的变量或函数(不可避免),使用起来就有问题了,为了解决这个问题,引入了名字空间这个概念,通过使用using namespace xxx;你所使用的库函数或变量就是在该名字空间中定义的.这样一来就不会引起不必要的冲突了.

所谓namespace,是指标识符的各种可见范围。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。  

一:<iostream>和<iostream.h>格式不一样,前者没有后缀,实际上,在你的编译器include文件夹里面可以看到,二者是两个文件,打开文件就会发现,里面的代码是不一样的。后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里,c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。因此,当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;当使用<iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。  

二:所谓namespace,是指标识符的各种可见范围。 C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择:  

1、直接指定标识符。例如std::ostream而不是ostream。完整语句如下: std::cout << std::hex<< 3.4 << std::endl;   

2、使用using关键字。 using std::cout; usingstd::endl; using std::cin; 以上程序可以写成 cout <<std::hex << 3.4 << endl;   

3、最方便的就是使用usingnamespace std;例如: #include#include#include using namespace std;这样命名空间std内定义的所有标识符都有效(曝光)。就好像它们被声明为全局变量一样。那么以上语句可以如下写: cout <<hex<< 3.4 << endl;因为标准库非常的庞大,所以程序员在选择的类的名称或函数名时就很有可能和标准库中的某个名字相同。所以为了避免这种情况所造成的名字冲突,就把标准库中的一切都被放在名字空间std中。但这又会带来了一个新问题。无数原有的C++代码都依赖于使用了多年的伪标准库中的功能,他们都是在全局空间下的。所以就有了和等等这样的头文件,一个是为了兼容以前的C++代码,一个是为了支持新的标准。命名空间std封装的是标准程序库的名称,标准程序库为了和以前的头文件区别,一般不加".h"

111  C++代码中的std::是什么意思,什么时候会用到?

std是名字空间里的,cout和endl cin这之类的,不是C++的关键字,而是C++名字空间里的函数名,因为直接写cout程序会无法识别,所以要在前面提示程序这个函数是std文件里的。
不过为了方便,可以在程序头上加上using namespace std; 当程序认不到cout啊这之类的是什么东西的时候,就会自动将其转换为std::cout。这种方法就是为了杜绝程序变的过于复杂。

112   get 取,获得(读), set 建立(写,修改);
113 C++字符串【转】

 LenLen(string|varname) 返回字符串内字符的数目,或是存储一变量所需的字节数。 
Trim Trim(string)
将字符串前后的空格去掉 
Ltrim Ltrim(string)
将字符串前面的空格去掉 
Rtrim Rtrim(string)
将字符串后面的空格去掉 
Mid Mid(string,start,length)
string字符串的start字符开始取得length长度的字符串,如果省略第三个参数表示从start字符开始到字符串结尾的字符串 

Left Left(string,length)
string字符串的左边取得length长度的字符串 
Right Right(string,length)
string字符串的右边取得length长度的字符串 
LCase LCase(string)
string字符串里的所有大写字母转化为小写字母 
UCase UCase(string)
string字符串里的所有大写字母转化为大写字母 
StrComp StrComp(string1,string2[
compare]) 返回string1字符串与string2字符串的比较结果,如果两个字符串相同,则返回0,如果小于则返回-1,如果大于则返回

InStr InStr(string1,string2[, compare])
返回string1字符串在string2字符串中第一次出现的位置 
Split Split(string1,delimiter[, count[, start]])
将字符串根据delimiter拆分成一维数组,其中delimiter用于标识子字符串界限。如果省略,使用空格("")作为分隔符。 
count
返回的子字符串数目,-1 指示返回所有子字符串。 
start
1 执行文本比较;如果为 0 或者省略执行二进制比较。

ReplaceReplace(expression, find, replacewith[, compare[, count[, start]]]) 返回字符串,其中指定数目的某子字符串(find)被替换为另一个子字符串(replacewith)

1Len函数示例: 
下面的示例利用 Len 函数返回字符串中的字符数目: 
Dim MyString 
MyString = Len("VBSCRIPT") ''MyString
包含 8

2
TrimLtrimRtrim函数示例: 
下面的示例利用 LTrim, RTrim, Trim 函数分别用来除去字符串开始的空格、尾部空格、开始和尾部空格: 
Dim MyVar 
MyVar = LTrim(" vbscript ") ''MyVar
包含 "vbscript" 
MyVar = RTrim(" vbscript ") ''MyVar
包含 "vbscript" 
MyVar = Trim(" vbscript ") ''MyVar
包含"vbscript"


3
Mid函数示例: 
下面的示例利用 Mid 函数返回字符串中从第四个字符开始的六个字符: 
Dim MyVar 
MyVar = Mid("VB
脚本is fun!", 4, 6) ''MyVar 包含 "Script"


4
Left函数示例:
下面的示例利用Left 函数返回MyString 的左边三个字母: 
Dim MyString, LeftString 
MyString = "VBSCript" 
LeftString = Left(MyString, 3) ''LeftString
包含 "VBS 

5
Right函数示例: 
下面的示例利用 Right 函数从字符串右边返回指定数目的字符: 
Dim AnyString, MyStr 
AnyString = "Hello World" ''
定义字符串。 
MyStr = Right(AnyString, 1) ''
返回 "d" 
MyStr = Right(AnyString, 6) ''
返回 "World" 
MyStr = Right(AnyString, 20) ''
返回 "HelloWorld" 

6
LCase函数示例: 
下面的示例利用 LCase 函数把大写字母转换为小写字母: 
Dim MyString 
Dim LCaseString 
MyString = "VBSCript" 
LCaseString = LCase(MyString) '' LCaseString
包含"vbscript" 

7
UCase函数示例: 
下面的示例利用 UCase 函数返回字符串的大写形式: 
Dim MyWord 
MyWord = UCase("Hello World") ''
返回"HELLOWORLD"


8
StrComp函数示例: 
下面的示例利用 StrComp 函数返回字符串比较的结果。如果第三个参数为 1 执行文本比较;如果第三个参数为 0 或者省略执行二进制比较。

Dim MyStr1,MyStr2, MyComp 
MyStr1 = "ABCD": MyStr2 = "abcd" ''
定义变量。 
MyComp = StrComp(MyStr1, MyStr2, 1) ''
返回 0 
MyComp = StrComp(MyStr1, MyStr2, 0) ''
返回 -1 
MyComp = StrComp(MyStr2, MyStr1) ''
返回 1


9
InStr示例: 
下面的示例利用 InStr 搜索字符串: 
Dim SearchString, SearchChar, MyPos 
SearchString ="XXpXXpXXPXXP"??? 
SearchChar = "P"?? 
MyPos = Instr(SearchString, SearchChar)???''
返回 9. 
注意:返回的不是一个字符串在另一个字符串中第一次出现的字符位置,而是字节位置。


10
Split函数示例: 
Dim MyString, MyArray, Msg 
MyString = "VBScriptXisXfun!" 
MyArray = Split(MyString, "x",-1,1) 
'' MyArray(0) contains "VBScript". 
'' MyArray(1) contains "is". 
'' MyArray(2) contains "fun!". 
Response.Write(MyArray(0))


11
Replace函数示例:

Replace("ABCD","BC", "12") ''得到A12D

1DateTime 数字型 
System.DateTime currentTime=new System.DateTime(); 
1.1
取当前年月日时分秒 
currentTime=System.DateTime.Now; 
1.2
取当前年 
int
=currentTime.Year; 
1.3
取当前月 
int
=currentTime.Month; 
1.4
取当前日 
int
=currentTime.Day; 
1.5
取当前时 
int
=currentTime.Hour; 
1.6
取当前分 
int
=currentTime.Minute; 
1.7
取当前秒 
int
=currentTime.Second; 
1.8
取当前毫秒 
int
毫秒=currentTime.Millisecond; 
(变量可用中文)

2Int32.Parse(变量)Int32.Parse("常量") 
字符型转换转为32位数字型

3、变量.ToString() 
字符型转换转为字符串 
12345.ToString("n"); //
生成 12,345.00 
12345.ToString("C"); //
生成¥12,345.00 
12345.ToString("e"); //
生成1.234500e+004 
12345.ToString("f4"); //
生成 12345.0000 
12345.ToString("x"); //
生成 3039 (16进制
12345.ToString("p"); //
生成 1,234,500.00%
4
、变量.Length 数字型 
取字串长度: 
如: string str="中国"; 
int Len = str.Length ; //Len
是自定义变量, str是求测的字串的变量名

5System.Text.Encoding.Default.GetBytes(变量
字码转换转为比特码 
如:byte[] bytStr = System.Text.Encoding.Default.GetBytes(str); 
然后可得到比特长度: 
len = bytStr.Length;

6System.Text.StringBuilder("") 
字符串相加,(+号是不是也一样?) 
如:System.Text.StringBuilder sb = newSystem.Text.StringBuilder(""); 
sb.Append("
中华"); 
sb.Append("
人民"); 
sb.Append("
共和国");

7、变量.Substring(参数1,参数2); 
截取字串的一部分,参数1为左起始位数,参数2为截取几位。 
如:string s1 = str.Substring(0,2);

8Stringuser_IP=Request.ServerVariables["REMOTE_ADDR"].ToString(); 
取远程用户IP地址

9、穿过代理服务器取远程用户真实IP地址: 
if(Request.ServerVariables["HTTP_VIA"]!=null){ 
string user_IP=Request.ServerVariables["HTTP_X_FORWARDED_FOR"].ToString(); 
}else{ 
stringuser_IP=Request.ServerVariables["REMOTE_ADDR"].ToString(); 


10
Session["变量"]; 
存取Session值; 
如,赋值: Session["username"]="小布什";

取值: Object objName=Session["username"]; 
String strName=objName.ToString(); 
清空:Session.RemoveAll();

11String str=Request.QueryString["变量"]; 
用超链接传送变量。 
如在任一页中建超链接:<a href=Edit.aspx?fbid=23>点击</a> 
Edit.aspx页中取值:Stringstr=Request.QueryString["fdid"];

12DOC对象.CreateElement("新建节点名"); 
创建XML文档新节点

13、父节点.AppendChild(子节点) 
将新建的子节点加到XML文档父节点下

14、父节点.RemoveChild(节点); 
删除节点

15Response 
Response.Write("
字串") 
Response.Write(
变量) 
向页面输出。

Response.Redirect("URL地址"); 
跳转到URL指定的页面

16char.IsWhiteSpce(字串变量,位数)——逻辑型 
查指定位置是否空字符; 
如: 
string str="
中国人民"; 
Response.Write(char.IsWhiteSpace(str,2)); //
结果为:True, 第一个字符是0位,2是第三个字符。

17char.IsPunctuation('字符') --逻辑型 
查字符是否是标点符号 
如:Response.Write(char.IsPunctuation('A')); //返回:False

18(int)'字符
把字符转为数字,查代码点,注意是单引号。 
如: 
Response.Write((int)'
'); //结果为中字的代码:20013

19(char)代码 
把数字转为字符,查代码代表的字符。 
如: 
Response.Write((char)22269); //
返回字。 

20
Trim() 
清除字串前后空格

21 、字串变量.Replace("子字串","替换为") 
字串替换 
如: 
string str="
中国"; 
str=str.Replace("
",""); //将国字换为央字 
Response.Write(str); //
输出结果为中央

再如:(这个非常实用)

stringstr="这是<script>脚本"; 
str=str.Replace("<","<font><</font>"); //
将左尖括号替换为<font><</font>(或换为<,但估计经XML存诸后,再提出仍会还原) 
Response.Write(str); //
显示为:这是<script>脚本

如果不替换,<script>将不显示,如果是一段脚本,将运行;而替换后,脚本将不运行。 
这段代码的价值在于:你可以让一个文本中的所有HTML标签失效,全部显示出来,保护你的具有交互性的站点。 
具体实现:将你的表单提交按钮脚本加上下面代码: 
string strSubmit=label1.Text; //label1
是你让用户提交数据的控件ID 
strSubmit=strSubmit.Replace("<","<font><</font>"); 
然后保存或输出strSubmit 
用此方法还可以简单实现UBB代码。

22Math.Max(i,j) 
ij中的最大值 
int x=Math.Max(5,10); // x将取值 10

加一点吧 23、字串对比...... 
加一点吧

23、字串对比一般都用: if(str1==str2){ } , 但还有别的方法:

(1) 
string str1; str2 
//
语法: str1.EndsWith(str2); __检测字串str1是否以字串str2结尾,返回布尔值.
if(str1.EndsWith(str2)){ Response.Write("
字串str1是以"+str2+"结束的"); }

(2) 
//
语法:str1.Equals(str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上.

(3) 
//
语法 Equals(str1,str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上.

24IndexOf() LastIndexOf() 
查找字串中指定字符或字串首次(最后一次)出现的位置,返回索引值,如: 
str1.IndexOf("
") //查找str1中的索引值(位置) 
str1.IndexOf("
字串")//查找字串的第一个字符在str1中的索引值(位置) 
str1.IndexOf("
字串",3,2)//str14个字符起,查找2个字符,查找字串的第一个字符在str1中的索引值(位置)

25Insert() 
在字串中指定索引位插入指定字符。如: 
str1.Insert(1,"
");str1的第二个字符处插入,如果str1="中国",插入后为中字国

26PadLeft()PadRight() 
在字串左(或右)加空格或指定char字符,使字串达到指定长度,如: 
<% 
string str1="
中国人"; 
str1=str1.PadLeft(10,'1'); //
无第二参数为加空格 
Response.Write(str1); //
结果为“1111111中国人,字串长为10 
%>

27Remove() 
从指定位置开始删除指定数的字符 
字串对比一般都用: if(str1==str2){ } , 但还有别的方法:

1 
string str1; str2 
//
语法: str1.EndsWith(str2); __检测字串str1是否以字串str2结尾,返回布尔值.
if(str1.EndsWith(str2)){ Response.Write("
字串str1是以"+str2+"结束的"); }

2 
//
语法:str1.Equals(str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上.

3 
//
语法 Equals(str1,str2); __检测字串str1是否与字串str2相等,返回布尔值,用法同上.

IndexOf() 
查找字串中指定字符或字串首次出现的位置,返首索引值,如: 
str1.IndexOf("
") //查找str1中的索引值(位置) 
str1.IndexOf("
字串")//查找字串的第一个字符在str1中的索引值(位置) 
str1.IndexOf("
字串",3,2)//str14个字符起,查找2个字符,查找字串的第一个字符在str1中的索引值(位置)

1.9 取中文日期显示——年月日时分 
string strY=currentTime.ToString("f"); //
不显示秒

1.10 取中文日期显示_年月 
string strYM=currentTime.ToString("y");

1.11 取中文日期显示_月日 
string strMD=currentTime.ToString("m");

1.12 取当前年月日,格式为:2003-9-23 
string strYMD=currentTime.ToString("d");

1.13 取当前时分,格式为:1424 
string strT=currentTime.ToString("t"); 
更新一下,上面不能编辑:

114  调用函数的过程;

调用函数时,前面不写类型,如果写类型,就成声明了;函数变量的类型也不用写;

bool CIniFileA::Writeini(std::string sSection,std::string sKeyName,const std::string& sValue ,const std::string& fileName)

{

// CIniSectionA* AddSection( std::string sSection);

// CIniKeyA* AddKey( std::string sKeyName );

// void SetValue( const std::string& sValue );

// bool Save( const std::string& fileName );

    AddSection( sSection );

    CIniSectionA a =newCIniSectionA (ꡧ)ê?;ê?

    a.AddKey( sKeyName );

    SetValue( sValue );

    Save( fileName );

    returntrue;

}

115

TCHAR.H routine

_UNICODE & _MBCS not defined

_MBCS defined

_UNICODE defined

_tstof

atof

atof

_wtof

_tstoi

atoi

atoi

_wtoi

_tstoi64

_atoi64

_atoi64

_wtoi64

_tstol

atol

atol

_wtol

_ttoi

atoi

atoi

_wtoi

_ttoi64

_atoi64

_atoi64

_wtoi64

_ttol

atol

atol

_wtol

TCHAR.H routine不仅适合UNICODE而且适合ASCII

_UNICODE & _MBCS not defined只适合UNICODE;

116用法:c_str()

error C2664: '_wtoi' : cannot convertparameter 1 from 'std::wstring' to 'const wchar_t *'

后面加上retValueLength.c_str()函数

c++中c_str()用法,

语法:

const char *c_str();

c_str()函数返回一个指向正规C字符串的指针, 内容与本string串相同.

这是为了与c语言兼容,在c语言中没有string类型,故必须通过string类对象的成员函数c_str()把string 对象转换成c中的字符串样式。

注意:一定要使用strcpy()函数等来操作方法c_str()返回的指针

比如:最好不要这样:

char* c;

string s="1234";

c = s.c_str(); //c最后指向的内容是垃圾,因为s对象被析构,其内容被处理

 

应该这样用:

char c[20];

string s="1234";

strcpy(c,s.c_str());

这样才不会出错,c_str()返回的是一个临时指针,不能对其进行操作

 

再举个例子

c_str() 以 char* 形式传回 string 内含字符串

如果一个函数要求char*参数,可以使用c_str()方法:

string s = "Hello World!";

printf("%s", s.c_str()); //输出"Hello World!"

 

117 C程序的格式字符串

Turbo C中格式字符串的一般形式为: [标志][输出最小宽度][.精度][长度]类型其中方括号[]中的项为可选项。各项的意义介绍如下: 
1.
类型类型字符用以表示输出数据的类型,其格式符和意义下表所示: 
表示输出类型的格式字符      格式字符意义 
d
                以十进制形式输出带符号整数(正数不输出符号) 
o
                以八进制形式输出无符号整数(不输出前缀O) 
x
                以十六进制形式输出无符号整数(不输出前缀OX) 
u
                以十进制形式输出无符号整数 
f
                以小数形式输出单、双精度实数 
e
                以指数形式输出单、双精度实数 
g
                以%f%e中较短的输出宽度输出单、双精度实数 
c
                输出单个字符 
s
                输出字符串 
2.
标志 
标志字符为-+#、空格四种,其意义下表所示: 
标志格式字符     标志意义 
-
         结果左对齐,右边填空格 
+
         输出符号(正号或负号)空格输出值为正时冠以空格,为负时冠以负号 
#
         对csdu类无影响;对o类,在输出时加前 
o        对x类,在输出时加前缀0x;对e,g,f 类当结果有小数时才给出小数点 
3.
输出最小宽度 
用十进制整数来表示输出的最少位数。若实际位数多于定义的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或0 
4.
精度 
精度格式符以“.”开头,后跟十进制整数。本项的意义是:如果输出数字,则表示小数的位数;如果输出的是字符,则表示输出字符的个数;若实际位数大于所定义的精度数,则截去超过的部分。 
5.
长度 
长度格式符为h,l两种,h表示按短整型量输出,l表示按长整型量输出。 
void main(){ 
int a=15; 
float b=138.3576278; 
double c=35648256.3645687; 
char d=’p’; 
printf(
"a=%d,%5d,%o,%x\n",a,a,a,a); 
printf("b=%f,%lf,%5.4lf,%e\n",b,b,b,b); 
printf("c=%lf,%f,%8.4lf\n",c,c,c); 
printf("d=%c,%8c\n",d,d); 
} a<--15 
b<--138.3576278 
c<--35648256.3645687 
d<--’p’ main() 

int a=29; 
float b=1243.2341; 
double c=24212345.24232; 
char c=’h’ 
printf("a=%d,%5d,%o,%x\n",a,a,a,a); 
printf("b=%f,%lf,%5.4lf,%e\n",b,b,b,b); 
printf("c=%lf,%f,%8.4lf\n",c,c,c); 
printf("d=%c,%8c\n",d,d); 

本例第七行中以四种格式输出整型变量a的值,其中“%5d ”要求输出宽度为5,而a值为15只有两位故补三个空格。第八行中以四种格式输出实型量b的值。其中“%f”和“%lf ”格式的输出相同,说明“l”符对“f”类型无影响。“%5.4lf”指定输出宽度为5,精度为4,由于实际长度超过5故应该按实际位数输出,小数位数超过4位部分被截去。第九行输出双精度实数,“%8.4lf ”由于指定精度为4位故截去了超过4位的部分。第十行输出字符量d,其中“%bc ”指定输出宽度为8故在输出字符p之前补加7个空格。 

使用printf函数时还要注意一个问题,那就是输出表列中的求值顺序。不同的编译系统不一定相同,可以从左到右,也可从右到左。Turbo C是按从右到左进行的。如把例2.13改写如下述形式: 
void main(){ 
int i=8; 
printf("%d\n%d\n%d\n%d\n%d\n%d\n",++i,--i,i--,i++,-i--); 
} i<--8 

这个程序与例2.13相比只是把多个printf语句改一个printf 语句输出。但从结果可以看出是不同的。为什么结果会不同呢?就是因为printf函数对输出表中各量求值的顺序是自右至左进行的。在式中,先对最后一项“-i--”求值,结果为-8,然后i自减1后为7。再对“-i++”项求值得-7,然后i自增1后为8。再对“i--”项求值得8,然后i再自减1后为7。再求“i++”项得7,然后I再自增1后为8。再求“--i”项,i先自减1后输出,输出值为7。最后才求输出表列中的第一项“++i”,此时i自增1后输出8。但是必须注意,求值顺序虽是自右至左,但是输出顺序还是从左至右,因此得到的结果是上述输出结果。 

118 _countof的用法

_countof(szT) 求字符串的长度

119 mbstowcs, _mbstowcs_l函数的用法

将一个序列的多字节字符到相应的宽字符序列。更安全的版本的这些函数可以使用;请参阅mbstowcs_s,_mbstowcs_s_l

size_t mbstowcs(

  wchar_t *wcstr,

  const char *mbstr,

  size_t count

);

[out] wcstr

The address of asequence of wide characters.

[in] mbstr

The address of asequence of null terminated multibyte characters.

[in] count

The maximum number ofmultibyte characters to convert.

errno_t mbstowcs_s(

  size_t *pReturnValue,

  wchar_t *wcstr,

  size_t sizeInWords,

  const char *mbstr,

  size_t count

);

[out] pReturnValue

The number of characters converted.

[out] wcstr

Address of buffer for the resulting converted wide characterstring.

[in] sizeInWords

The size of the wcstr buffer in words.

[in]mbstr

The address of a sequence of null terminated multibytecharacters.

[in] count

The maximum number of wide characters to store in the wcstr buffer, not includingthe terminating null, or _TRUNCATE.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值