1. 程式人生 > 其它 >C++字串分割

C++字串分割

C++

通過案例進行使用和學習

程式碼示例

 #include<iostream>
 #include<string>
 #include<vector>
 using namespace std;
 
 vector<string> split(const string& str, const string& delim) {  
 	vector<string> res;  
 	if("" == str) return res;  
 	//先將要切割的字串從string型別轉換為char*型別  
 	char * strs = new char[str.length() + 1] ; //不要忘了  
 	strcpy(strs, str.c_str());   
  
 	char * d = new char[delim.length() + 1];  
 	strcpy(d, delim.c_str());  
  
 	char *p = strtok(strs, d);  
 	while(p) {  
 		string s = p; //分割得到的字串轉換為string型別  
 		res.push_back(s); //存入結果陣列  
 		p = strtok(NULL, d);  
 	}  
  
 	return res;  
 	// 返回一個 vector<string>類的容器
 }  
 
  int main(int argc,char**argv)
  {
     string str1 = "how are you?";
 	vector<string> elm = split(str1," ");
 	for(int i = 0; i < elm.size(); i++){
 		cout<<elm[i];
 	}
      return 0;
  }
說明:
   當返回值是一個數組時,不妨採用vector類  用vector和string容器實現
   C 庫函式 char *strtok(char *str, const char *delim) 分解字串 str 為一組字串,delim 為分隔符  strtok(  )函式包含於標頭檔案 string.h
                                                      NULL的作用只是為了使得每次呼叫時,都不是從"My name is XiaoMing."的頭開始,而是從上次呼叫時查詢所停止的位置開始
            char *strcpy(char *dest,const char *src)    把 src 所指向的字串複製到 dest
			
	標準庫的string類提供了3個成員函式來從一個string得到c型別的字元陣列:c_str()、data()、copy(p,n)
	在C語言中沒有string型別,故必須通過string類物件的成員函式c_str()把string物件轉換成C中的字串樣式
	一定要使用strcpy()等函式來操作c_str()返回的指標
	
   & 讀作引用   // 宣告引用變數  引用通常用於函式引數列表和函式返回
      使用指標 來實現引用呼叫函式
	  使用引用 來實現引用呼叫函式。
C++ 語法
  如c++中的vector標頭檔案裡面就有這個push_back函式,在vector類中作用為在vector尾部加入一個數據。
用 C/C++ 遍歷目錄檔案主要有兩種方式
目錄檔案 分別對應在 Windows VS 環境下和 Linux\Unix 環境下的方法,
  它們各自所使用的函式如下:
 (Windows VS)_findfirst, _findnext, _findclose
  ( Linux\Unix)opendir, readdir, closedir    包含標頭檔案 <sys/types.h> 和 <dirent.h>
     基本流程:opendir-->readdir-->closedir
	   DIR *opendir(const char *pathname);  // 首先要開啟目錄,也就是要呼叫函式 opendir--
	         dp 為呼叫 opendir 時的返回值。當讀取成功時,函式返回一個儲存檔案資訊的 dirent 結構體指標
	   在 <dirent.h> 中定義了一個結構體 dirent ,用來儲存檔案資訊,   d_type 和 d_name 這兩個欄位,分別表示檔案型別和檔名
	   
文字
  標頭檔案中 #include<iostream> #include<fstream>  #include<sstream>
   文字讀取 ifstream
   文字寫入 ofstream 類,包含在 fstream 
   
使用FILE輸出txt檔案與fopen格式  fopen  fprintf  fclose

解析引數

  GNU C提供的函式getopt、getopt_long、getopt_long_only函式來解析命令列引數 
       命令列引數可以分為兩類,一類是短選項,一類是長選項,
	     短選項在引數前加一槓"-",
		 長選項在引數前連續加兩槓"--"
   argc 是 argument count的縮寫,表示傳入main函式的引數個數;

   argv 是 argument vector的縮寫,表示傳入main函式的引數序列或指標,
   並且第一個引數argv[0]一定是程式的名稱,並且包含了程式所在的完整路徑,
   所以確切的說需要我們輸入的main函式的引數個數應該是argc-1個	 argv是指向指標的指標 
   一般編譯器預設使用argc和argv兩個名稱作為main函式的引數,但這兩個引數如此命名並不是必須的,你可以使用任何符合C++語言命名規範的變數名作為入參
		 
   include <getopt.h>
   getopt   的引數包括argc及argv,它的功能是解析可選引數(以-開頭的引數) getopt函式只能處理短選項
   getopt_long  argc和argv 且多了兩個引數 longopts 及 longindex  getopt_long函式兩者都可以
    int getopt_long(int argc, char * const argv[], const char *optstring, const struct option *longopts, int *longindex);

	struct option
     {
        const char *name;
        int has_arg;
        int *flag;
        int val;
     };

    static struct option long_options[] = {{"help", no_argument, 0, 'h'},  {"task", required_argument, 0, 't'}, {"cestest", no_argument, 0, 'c'},  {nullptr, 0, nullptr, 0}};
    struct Args
    {
        bool help{false};
        std::string task;
        bool cestest{false};
    };
	// cd build && ./aidata --task tes--cestest
	args.task == "cestest"    
   
    warning: format '%s' expects argument of type 'char*', but argument 2 has type 'std::__cxx11::string {aka std::__cxx11::basic_string<char>}' [-Wformat=]

參考:

 https://blog.csdn.net/weixin_47826078/article/details/120444666 C++實現按指定子串分割母串(split)函式 按空格分割string字串
 https://www.cnblogs.com/cyblogs/p/9102854.html C/C++ 遍歷目錄檔案,預設目錄下(轉載)