C/C++中一些基礎整理

(1):  函數返回值的問題,就是子函數定義在棧區間和堆區間的問題,詳細看瀏覽器收藏的函數返回值,我覺得子函數返回的字符最好加上static,或從堆上申請空間,這樣不會出現函數結束內存釋放的問題。還有最重要的一點,
                       *p=NULL;
                       for (int i = 0; i < 100; i++)
	               {
		           *(s+i) = 'w';
	               }
切記這個只是在棧上申請了指針空間,必須還要去堆上申請裝數的空間。
     當函數結束時,釋放的是你的指針,常量不會釋放,所以有時候常量會在一個函數釋放之後存在。
(2):
int (*p)[4]: ()優先級高 *p 首先是一個指針,類型是int,後面的 [4]表明這是一個指向一維整型數組的指針。
int *p[4]:  []優先級高, p[4] 首先是一個數組,類型是 int * ,也就是這是一個存放4個整型指針的數組p。
(3):sizeof()對數組求長度,是求它在內存中的長度。strlen()求得是實際所佔的長度。a[41]="1234567";sizeof(a)=41;strlen(a)=7
sizeof(a) 是指a的內存空間大小,strlen() 查找到“\0”就結束。
(4)用strncpy截取字符串長度,strncpy(a,b+4,7);可以將這裏的a,b看成指針。將b的指針向前移動4,就是截取4位以後的位數。
(5)vector<vector<int>> test在vector中表示數組。vector<int> num1(s1.length(),0);指定num1的長度並且全部置爲0;
(6)棧的函數 stack<int> s;	s.push(1);  // void push(T t);壓棧存入數據	s.push(2);	s.push(3);	
                                int result = s.top(); // T top();只輸出第一個頂部數據,不彈棧	
                                s.pop(); // void pop();彈棧存入數據
                                s.empty();//棧爲空爲真;
(7)隊列的函數  queue<int>s;
1. push() 
2. pop() 取出隊尾元素
3. size() 
4. empty() 
5. front() 返回最前面的元素
6. back() 返回最後面的元素
(8)將數字轉化爲字符:
char s[4];
sprintf(s, "%8d%8d", 123, 4567);
(9)打印出系統錯誤信息。
 int ret = 0; 
 ret = pox_system("gzip -c /var/opt/I00005.xml > /var/opt/I00005.z"); 
 if(0 != ret) 
 { 
   Log("zip file failed: %s\n", strerror(errno)); //嘗試打印出系統錯誤信息 
 } 
(10):vector<string>str:輸出的問題;
     cout<<str[0]開始不能輸出,才知道忘記加了#include<string>要不輸不出字符串。
(11):string類型,目的:將數組中的數字連續輸入string中。
		string str = "";
		for (i=0; i<numbers.size(); i++)
		{
			char s[4] = { 0 };
			sprintf(s, "%d", numbers[i]);
			str =str+s;
		}
(12):string類型中存放數字可以直接比較大小,不用轉換成int類型。
(13):string 的函數:
size()和length();
push_back() 和 insert();
erase();
replace();
find();
sort(s.begin(),s.end())(地址);
strtok() & substr();
(14)int a=4;int b=a>>1;a值不變,b=2;如果b=a<<1;b=8;
(15)list<int>circle
   list<int>::iterator next定義了一個指向list函數的指針。
back() 返回最後一個元素 
begin() 返回指向第一個元素的迭代器(指針)
clear() 刪除所有元素
 empty() 如果list是空的則返回
end() 返回末尾的迭代器(不是最後一個元素,是最後一個元素的下一個指針) 
erase() 刪除一個元素
front() 返回第一個元素 
get_allocator() 返回list的配置器 
insert() 插入一個元素到list中
 max_size() 返回list能容納的最大元素數量
 merge() 合併兩個list 
pop_back() 刪除最後一個元素 
pop_front() 刪除第一個元素 
push_back() 在list的末尾添加一個元素 
push_front() 在list的頭部添加一個元素
sort()排序。
(16)sprintf(sSttl_brno,"%.3s001",sOpn_br_no);
    fprintf()函數主要用於格式化信息輸出到指定的文件流中
    char esb_req_head[1024]={0};
    sprintf(esb_req_head,"%-4.4s","1001");  	
    sprintf(esb_req_head+strlen(esb_req_head),"%-16.16s","6001");
	
    sprintf(esb_req_head+strlen(esb_req_head),"%-2.2s","05");
	
    sprintf(esb_req_head+strlen(esb_req_head),"%-10.10s","CBS");
(17)string to_string(int) 頭文件string,將int型轉化爲string類型。C++中。
(18)sort()排序函數。bool compare(int a,int b)
{
return a>b;
}vector<int>data;sort(data.begin(),data.end(),compare);
(19)ascii轉化爲BCD碼,比如char ascii[12] = { '1', '2'};本來它的存儲是0X31,0X32,兩個字節,但是轉化爲12  BCD編碼就是0X12,兩個以上的字符這樣可以節省空間,比較好用。
(20)int 最小值:INT_MIN,最大值:INT_MAX 
(21)(2+x)^(~3)   ^異或的意思。~取反的意思。
(22)scanf("%d",&m)!=EOF 判斷是否有輸入。
(23)64位系統的地址佔8個字節,32位系統的地址佔4個字節。
(24)struct node{
    int x,y,k,step;
    node(int x,int y,int k,int step):x(x),y(y),k(k),step(step)()
};這樣寫就可以直接調用node(x,y,k,step);
(25):                   //if('a'<=G[nx][ny]&&G[nx][ny]<='z') key=key|(1<<(G[nx][ny]-'a'));
                        //if('A'<=G[nx][ny]&&G[nx][ny]<='Z'&&(key&(1<<(G[nx][ny]-'A')))==0) continue;
			if (G[nx][ny]>='a'&&G[nx][ny] <= 'z') key = key|(1 << (G[nx][ny] - 'a'));
			if (G[nx][ny]>='A'&&G[nx][ny] <= 'Z' && (key&(1<<(G[nx][ny]-'A')) == 0)) continue;
最好寫成上面一串形式的,要不會出錯。
(26)TreeNode *head=new TreeNode(pre[0]);爲值爲pre[0]的數申請一個內存地址空間。
    開頭計算連續的字符
(27)strcspn() 用來計算字符串 str 中連續有幾個字符都不屬於字符串 accept 特別注意都是從開頭計算連續的字符。
    strspn() 函數用來計算字符串 str 中連續有幾個字符都屬於字符串 accept,
  #include <string.h>
 
  main()
 
  {
   
    char *str = "Linux was first developed for 386/486-based pcs.";
    char *str1 = " was first developed for 386/486-based pcs.";
 
    printf("%d\n", strcspn(str, " "));

    printf("%d\n", strspn(str, " "));

    printf("%d\n", strspn(str1, " "));
 
    printf("%d\n", strcspn(str, "/-"));
 
    printf("%d\n", strcspn(str, "1234567890"));
 
  }
 
 執行結果:
 
 5 //只計算到" "的出現, 所以返回"Linux"的長度
 
 0 // 從開始計算連續" "的出現的次數。(特別注意)

 1 // 從開始計算連續" "的出現的次數。(特別注意)

 33 //計算到出現"/"或"-", 所以返回到"6"的長度
 
 30 // 計算到出現數字字符爲止, 所以返回"3"出現前的長度
(28)排列組合(見字符串排列組合)
通過採用循環套遞歸,首先讓他執行到尾部,然後從尾部到首部這樣開始。
比如輸入abc
執行結束後爲abc,acb,bac,bca,cba,cab。
(29)sort()函數,三個參數時。
求正數數組中的數拼接成最小的一個數,sort()中第三個參數可以設定怎樣比較排序,同時第三個參數定義函數爲靜態函數。
static bool cmp(int a,int b)
    {
        string A="";
        string B="";
        A=A+to_string(a);
        A=A+to_string(b);
        B=B+to_string(b);
        B=B+to_string(a);
        return A<B;
    }
string PrintMinNumber(vector<int> numbers) {
        string answer="";
        sort(numbers.begin(),numbers.end(),cmp);
        for(int i=0;i<numbers.size();i++)
        {
            answer=answer+to_string(numbers[i]);
        }
        return answer;
    }
(30)string to_string (int val);將int類型轉化爲string類型數據。
(31)char cPasswd[6+1] ;

	memset(cPasswd, 0x0, sizeof(cPasswd));
(32)memset(sTmp_str, 0, sizeof(sTmp_str));
		fgets(sTmp_str,1023,fp);從一個文本文件中讀取一串字符,遇到\n結束或者1023結束,末尾再加\0;
(33)
class TA
{
   public:
      int &m_i;
   TA(int &i):m_i(i)
     {
        cout<<"TA()構造函數被執行"<<endl;
      }
   TA(const TA &ta):m_i(ta.m_i)
      {
         cout<<"TA()拷貝構造函數被執行"<<endl;
       }
    ~TA()
       {
          cout<<"~TA()析構函數被執行"<<endl;
        }
     void operator()()
       {
       }
}
a)相當於一個#include"TA.h"文件,
構造函數相當於爲創建的對象分配存儲空間。
拷貝構造函數相當於複製一個構造函數,比如在一個不輸主函數中定義了一個對象,想要傳給主函數時由於其爲局部對象,所以
借用拷貝構造函數來實現複製。
析構函數相當於爲函數釋放內存空間。
b)this指針,在每一個成員函數中都擁有一個this指針,這樣能確保不同對象調用函數時的單對單性
c)外部變量,當在兩個.cpp文件中都必須調用同一個變量,在一個.cpp文件定義後分配空間後,同一個項目下一個.cpp文件使用
加extern 這樣就可以使用,不需再分配空間。否則會報"重複定義"錯誤。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章