C++工程師必備的字符串操作技巧

在C++開發中,字符串操作是經常用到的操作之一。字符串操作的靈活應用,能夠提高代碼的效率,減少重複工作,以及讓代碼更加易於維護和升級。因此,作為C++工程師,熟練掌握字符串操作技巧,是十分必要的。本文將從多個方面對C++工程師需要掌握的字符串操作技巧進行詳細的闡述。

一、字符串基本操作

字符串基本操作是C++工程師的基本功之一,掌握了這些操作,才能更好地實現具體的業務需求。常見的字符串基本操作函數有下面這些:

1. strlen函數

strlen函數用於求字符串的長度,其定義如下:

“`c++
size_t strlen(const char* str);
“`

str為一個指向C字符串的指針,函數的返回值是字符串的長度。

示例代碼:

“`c++
#include
#include
using namespace std;

int main(){
const char* str = “Hello World!”;
cout<<"The length of the string is:"<<strlen(str)<<endl;
return 0;
}
“`

2. strcpy函數

strcpy函數用於將一個字符串複製到另一個字符串中,其定義如下:

“`c++
char* strcpy(char* dest, const char* src);
“`

dest為目標字符串的指針,src為源字符串的指針,函數的返回值為目標字符串的指針。

示例代碼:

“`c++
#include
#include
using namespace std;

int main(){
char str1[20], str2[20];
strcpy(str1, “Hello World!”);
strcpy(str2, str1);
cout<<"str1:"<<str1<<endl;
cout<<"str2:"<<str2<<endl;
return 0;
}
“`

3. strcat函數

strcat函數用於將一個字符串連接到另一個字符串的末尾,其定義如下:

“`c++
char* strcat(char* dest, const char* src);
“`

dest為目標字符串的指針,src為源字符串的指針,函數的返回值為目標字符串的指針。

示例代碼:

“`c++
#include
#include
using namespace std;

int main(){
char str1[20] = “Hello “, str2[20] = “World!”;
strcat(str1, str2);
cout<<str1<<endl;
return 0;
}
“`

二、字符串查找和替換

字符串查找和替換是字符串操作中的另一重要方面,能夠幫助C++工程師更好地處理字符串中的信息,完成代碼的具體業務需求。常用的字符串查找和替換函數有如下幾個:

1. strstr函數

strstr函數用於查找一個字符串中是否包含另一個子字符串,其定義如下:

“`c++
char* strstr(const char* str1, const char* str2);
“`

str1為源字符串的指針,str2為待查找的子字符串的指針,函數的返回值為子字符串在源字符串中的指針,如果未找到,返回NULL。

示例代碼:

“`c++
#include
#include
using namespace std;

int main(){
const char* str1 = “Hello World!”;
const char* str2 = “World”;
if(strstr(str1, str2)){
cout<<"Find! The position of str2 in str1:"<<strstr(str1, str2) – str1<<endl;
}
else{
cout<<"Not find!"<<endl;
}
return 0;
}
“`

2. str_replace函數

str_replace函數用於將一個字符串中的指定子字符串替換為另一個字符串,其定義如下:

“`c++
void str_replace(string& str, const string& old_value, const string& new_value);
“`

str為源字符串,old_value為需要替換的子字符串,new_value為替換後的子字符串。

示例代碼:

“`c++
#include
#include
using namespace std;

void str_replace(string& str, const string& old_value, const string& new_value){
for(string::size_type pos = 0; pos != string::npos; pos += new_value.length()){
pos = str.find(old_value, pos);
if(pos != string::npos){
str.replace(pos, old_value.length(), new_value);
}
else{
break;
}
}
}

int main(){
string str = “Hello World!”;
string old_value = “World”;
string new_value = “Bob”;
str_replace(str, old_value, new_value);
cout<<str<<endl;
return 0;
}
“`

三、字符串分割和合併

字符串分割和合併是實現具體業務算法的重要基礎,有時候需要對字符串進行分割或者合併處理,才能完成需要的算法操作。下面是常用的字符串分割和合併函數:

1. strtok函數

strtok函數用於將一個字符串根據指定的分隔符進行分割,其定義如下:

“`c++
char* strtok(char* str, const char* delim);
“`

str為待分割的字符串,delim為分隔符,函數返回分割後的字符串。需要注意的是,調用strtok函數時,需要先調用一次,後續的調用都傳入NULL作為第一個參數。

示例代碼:

“`c++
#include
#include
using namespace std;

int main(){
char str[] = “apple,banana,orange”;
char* p = strtok(str, “,”);
while(p){
cout<<p<<endl;
p = strtok(NULL, ",");
}
return 0;
}
“`

2. join函數

join函數用於將多個字符串進行合併,其定義如下:

“`c++
template
string join(const vector& vec, const char* delim);
“`

vec為待合併的字符串向量,delim為分隔符,函數返回合併後的字符串。

示例代碼:

“`c++
#include
#include
#include
using namespace std;

template
string join(const vector& vec, const char* delim){
string result(“”);
for(typename vector::const_iterator iter=vec.begin(); iter!=vec.end(); ++iter){
result += *iter;
result += delim;
}
result.erase(result.length() – strlen(delim), strlen(delim));
return result;
}

int main(){
vector vec;
vec.push_back(“apple”);
vec.push_back(“banana”);
vec.push_back(“orange”);
cout<<join(vec, ",")<<endl;
return 0;
}
“`

四、字符串格式化和編解碼

字符串格式化和編解碼是字符串操作中的高級內容,能夠更加靈活地操控字符串,使得代碼更加高效和易於維護。下面是常見的字符串格式化和編解碼函數:

1. sprintf函數

sprintf函數用於將一組數據,按照指定的格式輸出到字符串中,其定義如下:

“`c++
int sprintf(char* str, const char* format, …);
“`

str為接收數據的字符串,format為格式化字符串,函數的返回值是輸出到str中的字符數。

示例代碼:

“`c++
#include
#include
using namespace std;

int main(){
char str[50];
sprintf(str, “%d %s %f”, 10, “Bob”, 1.5);
cout<<str<<endl;
return 0;
}
“`

2. base64編解碼

base64編解碼是將二進制數據使用64個字符表示的編碼方式,常用於在網絡傳輸中傳遞二進制數據。下面是base64編解碼的實現方法:

示例代碼:

“`c++
#include
#include
using namespace std;

static const string base64_chars =
“ABCDEFGHIJKLMNOPQRSTUVWXYZ”
“abcdefghijklmnopqrstuvwxyz”
“0123456789+/”;

string base64_encode(const char* bytes_to_encode, unsigned int in_len){
string ret;
int i = 0, j = 0;
unsigned char char_array_3[3], char_array_4[4];

while(in_len–){
char_array_3[i++] = *(bytes_to_encode++);
if(i == 3){
char_array_4[0] = (char_array_3[0] & 0xfc) >> 2;
char_array_4[1] = ((char_array_3[0] & 0x03) <> 4);
char_array_4[2] = ((char_array_3[1] & 0x0f) <> 6);
char_array_4[3] = char_array_3[2] & 0x3f;

for(i = 0; i < 4; i++){
ret += base64_chars[char_array_4[i]];
}
i = 0;
}
}

if(i){
for(j = i; j > 2;
char_array_4[1] = ((char_array_3[0] & 0x03) <> 4);
char_array_4[2] = ((char_array_3[1] & 0x0f) <> 6);
char_array_4[3] = char_array_3[2] & 0x3f;

for(j = 0; j < i + 1; j++){
ret += base64_chars[char_array_4[j]];
}

while(i++ < 3){
ret += '=';
}
}

return ret;
}

string base64_decode(const string& encoded_string){
int in_len = encoded_string.size(), i = 0, j = 0, in_ = 0;
unsigned char char_array_4[4], char_array_3[3];
string ret;

while(in_len– && (encoded_string[in_] != '=') && is_base64(encoded_string[in_])){
char_array_4[i++] = encoded_string[in_];
in_++;

if(i == 4){
for(i = 0; i < 4; i++){
char_array_4[i] = base64_chars.find(char_array_4[i]);
}

char_array_3[0] = (char_array_4[0] <> 4);
char_array_3[1] = ((char_array_4[1] & 0xf) <> 2);
char_array_3[2] = ((char_array_4[2] & 0x3) << 6) + char_array_4[3];

for(i = 0; i < 3; i++){
ret += char_array_3[i];
}
i = 0;
}
}

if(i){
for(j = i; j < 4; j++){
char_array_4[j] = 0;
}

for(j = 0; j < 4; j++){
char_array_4[j] = base64_chars.find(char_array_4[j]);
}

char_array_3[0] = (char_array_4[0] <> 4);
char_array_3[1] = ((char_array_4[1] & 0xf) <> 2);

for(j = 0; j < i – 1; j++){
ret += char_array_3[j];
}
}

return ret;
}

bool is_base64(unsigned char c){
return (isalnum(c) || (c == '+') || (c == '/'));
}

int main(){
string str = "Hello World!";
string encoded = base64_encode(str.c_str(), str.length());
cout<<encoded<<endl;
string decoded = base64_decode(encoded);
cout<<decoded<<endl;
return 0;
}
“`

總結

本文中,我們詳細地介紹了C++工程師需要掌握的字符串操作技巧。從字符串基本操作、字符串查找和替換、字符串分割和合併、字符串格式化和編解碼四個方面,分別闡述了常用的字符串操作函數及其使用方法,並提供了相應的代碼示例。通讀全

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/194309.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-02 14:37
下一篇 2024-12-02 14:38

相關推薦

發表回復

登錄後才能評論