C++字串分割
阿新 • • 發佈:2022-05-05
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++ 遍歷目錄檔案,預設目錄下(轉載)