C語言中常用的字串操作(子串分割、替換、去前後空格、遞迴實現字串反轉)
阿新 • • 發佈:2019-02-09
在C語言中,並沒有像java中對字串操作的封裝好的函式,在C語言中,都需要自己根據C語言函式庫來實現常用的字串操作
一、字串的分割,根據子串進行分割
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
//字串的分割,根據子串分割字串
//引數:
//str被分割的字串
//sub子串
//sub_before為str中sub所在位置的之前部分
//sub_after為str中sub所在位置的之後部分,包括sub
void str_split(const char* str/*in*/,char* sub/*in*/,char** sub_before/*out*/,char** sub_after/*out*/){
if ( str == NULL || *str=='\0' || sub==NULL){
printf("function str_split error:( str == NULL || *str=='\0' || sub==NULL)");
return;
}
if (*sub_before == NULL){
*sub_before = (char*)malloc(strlen(str));
}
if (*sub_after == NULL){
*sub_after = (char*)malloc(strlen(str));
}
//分割字串的時候使用strstr函式,返回是第一個sub地址,如果沒有匹配的則返回NULL
char* temp = (char*)malloc(strlen(str));
strcpy(temp,str);
*sub_after = strstr(temp, sub);
//沒有匹配的子串
if (*sub_after == NULL || **sub_after == '\0'){
printf("the str without sub");
return;
}
//新增結束標誌符
*(*sub_after + strlen(*sub_after)) = '\0';
//將字串中sub之前的字元賦值給sub_before
int i = 0;
while (i < (strlen(temp)-strlen(*sub_after))){
*(*sub_before + i) = *(temp+i);
i++;
}
//新增結束標誌符,新增結束標誌的目的是為了防止亂碼
*(*sub_before + i) = '\0';
}
二、去字串的前後空格
//傳入一個字串,去除字串前後的空格
//引數:
//str為需要去除空格的字串
//newchar為去除空格之後的字串
void trim_space(const char* str/*in*/,char* newchar/*out*/){
if (str == NULL || *str == '\0' || newchar == NULL){
printf("function trim_space error:(str==NULL || *str=='\0' || newchar == NULL)");
return;
}
//利用左右開弓來去除前後的空格
int i = 0, j = strlen(str);
//isspace函式是用來判斷字元是否為空格
//求出,在str字串前面有多少個空格
while (isspace(str[i]) || str[i]=='\0')
{
i++;
}
//求出,在str字串後面有多少個空格
while (isspace(str[j]) || str[j]=='\0'){
j++;
}
//從str+i個位置開始將(j-i+1)個字元拷貝到newchar中
strncpy(newchar,str+i,j-i+1);
}
三、遞迴實現字串的反轉
//通過函式的遞迴呼叫來實現字串的反轉
//引數:
//str:需要反轉的字串
//inverse_str:反轉之後的字串
void str_inverse(const char* str/*in*/,char* inverse_str/*out*/){
//遇到異常情況,直接跳出方法
if (str == NULL || inverse_str==NULL){
printf("function str_inverse error:(str == NULL || inverse_str==NULL)");
return;
}
//遞迴的結束,當到str字串結束的時候
if (*str == '\0'){
return;
}
str_inverse(str+1,inverse_str);
strncat(inverse_str,str,1);
}
void main(){//呼叫字串反轉
char* s = "abcdefg";
//char result[10] = {0};//這種方式可以呼叫成功
//char* result = (char*)malloc(strlen(s));//這種會宕機(出現異常),原因是因為malloc函式不會初始化導致,因為開闢空間的時候只開闢了
//那麼多,而後面使用strcat函式進行拼接,是直接在以前的基礎上進行拼接,會出現,前面亂碼,但是結果還是正確的
char* result = (char*)calloc(strlen(s),1);
str_inverse(s,result);
cout << result << endl;
}
四、字串的替換(下面的函式使用到了上面的字串分割函式str_split)
//字串的替換
//引數:
//str:原字串
//replace_str:要被替換的字串
//replace_become:要替換成什麼字串
//replace_after:替換之後的字串
void str_replace(const char* str/*in*/,char* replace_str/*in*/,char* replace_become/*in*/,char** replace_after/*out*/){
//遇到異常情況直接退出
if (str == NULL || *str == '\0' || replace_str == NULL || replace_str == '\0' || replace_become == NULL || *replace_become=='\0'){
printf("function str_replace error:(str==NULL || *str =='\0' || replace_str==NULL || replace_str=='\0')");
return;
}
const char* flag = strstr(str,replace_str);
//字串str中沒有子串
if (flag==NULL){
printf("the str without replace_str");
return;
}
//為結果開闢空間
*replace_after = (char*)calloc(strlen(str)+strlen(replace_become)-strlen(replace_str),1);
//通過字串的分割之後進行拼接
char *after = NULL, *before=NULL;
while (flag){
if (after == NULL){
str_split(str, replace_str, &before, &after);
}
else{
str_split(after, replace_str, &before, &after);
}
strcat(*replace_after,before);
strcat(*replace_after,replace_become);
after = after + strlen(replace_str);
flag = strstr(after,replace_str);
}
if (after != '\0'){
strcat(*replace_after,after);
}
}
要想掌握好c語言中的指標,多做一下c語言中的字串操作是最好的辦法。